Python прокси-сервер, который обрабатывает запросы CONNECT - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь создать прокси, который может обрабатывать запросы как 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 и притворяюсь, что у меня есть туннель?

1 Ответ

1 голос
/ 19 апреля 2020

Простой HTTP-запрос (GET, POST, ...) перенаправляется на сервер через прокси-сервер (обычно после переписывания пути, который больше не является полным URL-адресом), и ответ от сервера отправляется обратно клиенту , В случае CONNECT это не так.

Запрос CONNECT отправляется только от клиента к прокси. не пересылается на сервер . Вместо этого прокси установит sh TCP-соединение с сервером и после успешного завершения вернет успешный ответ клиенту, то есть HTTP/1.0 200 .... Другими словами: запрос / ответ CONNECT выполняется только между клиентом и прокси-сервером, и сервер ничего не видит в этом.

После установления TCP-соединения с сервером и ответа HTTP отправляет клиенту все данные из клиент должен быть перенаправлен на сервер, а все данные с сервера должны быть переданы клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...