¿Cómo respondo a una solicitud de método “CONECTAR” en un servidor proxy usando socket en python?

Actualmente estoy progtwigndo un servidor proxy usando httplib, y cuando bash conectarme a sitios web HTTPS (como facebook y google) mi cliente me envía las solicitudes “CONECTAR” que se parecen a esto:

CONNECT www.google.co.il:443 HTTP/1.1\r\n User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0\r\n Proxy-Connection: keep-alive\r\n Connection: keep-alive\r\n Host: www.google.co.il:443\r\n \r\n 

Tomé un proxy de trabajo de Internet y lo puse, luego olfateé la red en Wirehark, y la respuesta a esta solicitud debería verse así:

 HTTP/1.1 200 Connection established\n Proxy-agent: Python Proxy/0.1.0 Draft 1\n \n 

Noté que el cliente envía la solicitud al propio proxy, por lo que decidí usar socket y enviar la respuesta al cliente de esta manera:

 if getmethod(clientreq) is "CONNECT": text="HTTP/1.1 200 Connection established\nProxy-Agent: THE BB Proxy\n\n" client.send(text) 

Realmente esperaba que el manejo de esas solicitudes de “CONEXIÓN” fuera la solución y que mi servidor finalmente se encargue de las solicitudes de HTTPS, pero no lo hace, y los paquetes de respuesta que envío al cliente ni siquiera aparecen en Wirehark.

Así que mis preguntas son: 1. ¿Qué hace realmente el método “CONECTAR”? 2. ¿Qué más necesito, excepto el manejo de las solicitudes del método “CONECTAR” para comunicarme con un servidor HTTPS?

Estoy respondiendo después de tanto tiempo porque recientemente trabajé con este concepto. Puede ayudar a otros.

Para trabajar con el método HTTP CONNECT, el proxy necesita crear una conexión de socket con el puerto https del servidor (por ejemplo, 443). Una vez que se establece la conexión, puede enviar “HTTP / 1.1 200 Conexión establecida” como respuesta.

Después de este cliente y servidor se comunican entre sí a través de proxy. El proxy solo tiene que transferir datos desde el socket del cliente al socket del servidor y viceversa. El cliente y el servidor intercambiarán la información del certificado para el protocolo de intercambio, una vez que se realiza el intercambio de datos, comenzarán a compartir los datos en formato cifrado para que el proxy no pueda entender nada.

Que el siguiente código te ayude.

 def _read_write(self): socs = [self.client, self.target] count = 0 while 1: count += 1 (recv, _, error) = select.select(socs, [], socs, 3) if error: break if recv: for in_ in recv: data = in_.recv(BUFLEN) if in_ is self.client: out = self.target else: out = self.client if data: out.send(data) print(data) count = 0 if count == time_out_max: break 

Espero que esta respuesta ayude a cualquiera en necesidad. Como tuve que pasar por muchas cosas para encontrar esta respuesta.