Я сейчас делаю 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
.