Я пытаюсь создать прокси, который может обрабатывать запросы как HTTP, так и HTTPS, и он отлично работает для HTTP-запросов, таких как GET и POST, но для запроса CONNECT я не получаю ответа от веб-сервера.
Это более простая версия моего прокси, которая иллюстрирует проблему.
import socket
IP = "0.0.0.0"
PORT = 1234
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
server_socket.bind((IP, PORT))
server_socket.listen()
while True:
conn, _ = server_socket.accept()
header_bytes, _ = conn.recv(1024).split(b"\r\n\r\n")
header_bytes += b"\r\n\r\n"
print("header: ", header_bytes)
for header in header_bytes.split(b"\r\n"):
key, value = header.split(b":", 1)
if key == b"Host":
if b":" not in value:
value += b":80"
break
addr, port = value.split(b":")
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((addr.decode("utf-8").replace(" ", ""), int(port.decode("utf-8"))))
client_socket.send(header_bytes)
response = client_socket.recv(1024)
print("response: ", response)
conn.send(response)
conn.close()
Что я получаю, это
header: b'CONNECT www.google.com:443 HTTP/1.1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0\r\n
Proxy-Connection: keep-alive\r\n
Connection: keep-alive\r\n
Host: www.google.com:443\r\n\r\n'
response: b''
После прочтения еще немного о CONNECT запрос Я думаю, что, возможно, неправильно понял, как это должно работать, но я все еще не понимаю, как мне его реализовать. В нем говорится, что я должен установить sh туннель к веб-серверу, но как мне это сделать, если я не получаю ответ на мой запрос CONNECT. Я просто отправляю ответ 200 OK и притворяюсь, что у меня есть туннель?