Использование сокетов из туннеля HTTP - PullRequest
0 голосов
/ 08 мая 2019

Я сейчас делаю MITM на основе HTTP-туннеля .

Для этого я реализовал метод do_CONNECT из BaseHTTPRequestHandler следующим образом:

def do_CONNECT(self):
    address = self.path.split(":", 1)
    address[1] = int(address[1]) or 443
    try:
        coServ = socket.create_connection(address, timeout=self.timeout)
    except Exception as e:
        self.send_error(502)
        return
    self.send_response(200, "Connection Established")
    self.end_headers()

    my_function(self.connection, coServ)

    # VERY IMPORTANT to avoid looping
    self.close_connection = True

В настоящее время my_function делает все необходимое для работы с сокетами (пересылает сообщения), затем do_CONNECT возвращает и TCPServer.close_request закрывает сокет от клиента (self.connection). Все работает как положено.

Я обслуживаю RequestHandler через ThreadingHTTPServer .

Я бы хотел использовать сокеты, особенно клиентские, из другого потока. Проблема в том, что если my_function просто хранит self.connection, то он будет закрыт TCPServer. Затем я должен заставить my_function подождать, но это просто заставляет один поток простаивать. Кроме того, я должен решить, когда я закрою эту тему

У кого-нибудь есть лучшее решение, например, простое отключение закрытия сокета или его копирование?

Полагаю, в конце концов, это неплохая сделка, так как я могу просто поставить блокировку, которую я снимаю, когда хочу закрыть соединение и завершить do_CONNECT.

...