我如何回应一句话;“连接”;在python中使用套接字的代理服务器中的方法请求?

我如何回应一句话;“连接”;在python中使用套接字的代理服务器中的方法请求?,python,sockets,proxy,httplib,Python,Sockets,Proxy,Httplib,我目前正在使用httplib编程代理服务器, 当我尝试连接到HTTPS网站(如facebook和google)时,我的客户端会向我发送如下“连接”请求: 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 Connectio

我目前正在使用httplib编程代理服务器, 当我尝试连接到HTTPS网站(如facebook和google)时,我的客户端会向我发送如下“连接”请求:

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
我从互联网上获取一个工作代理并将其打开,然后在wireshark上嗅探网络,对此请求的响应应如下所示:

HTTP/1.1 200 Connection established\n
Proxy-agent: Python Proxy/0.1.0 Draft 1\n
\n
if getmethod(clientreq) is "CONNECT":
    text="HTTP/1.1 200 Connection established\nProxy-Agent: THE BB Proxy\n\n"
    client.send(text)
我注意到客户端将请求发送到代理本身,因此我决定使用套接字,并通过以下方式将响应发送到客户端:

HTTP/1.1 200 Connection established\n
Proxy-agent: Python Proxy/0.1.0 Draft 1\n
\n
if getmethod(clientreq) is "CONNECT":
    text="HTTP/1.1 200 Connection established\nProxy-Agent: THE BB Proxy\n\n"
    client.send(text)
我真的希望处理那些“连接”请求是解决方案,我的服务器最终会处理HTTPS请求,但事实并非如此,我发送给客户端的响应包甚至不会出现在wireshark上

因此,我的问题是: 1.“连接”方法真正的作用是什么?
2.为了与HTTPS服务器通信,除了处理“连接”方法请求之外,我还需要什么呢?

我在这么长时间后回复,因为我最近使用了这个概念。它可以帮助别人

要使用连接http方法代理,需要使用服务器的https端口(例如443)创建套接字连接。一旦建立连接,您就可以发送“HTTP/1.1 200已建立连接”作为响应

之后,客户端和服务器通过代理相互通信。代理只需将数据从客户端套接字传输到服务器套接字,反之亦然。客户端和服务器将交换证书信息进行握手,握手完成后,它们将开始以加密格式共享数据,这样代理将无法理解任何内容

下面的代码可以帮助您

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
希望这个答案能帮助任何需要帮助的人。
因为我必须经历很多事情才能找到这个答案。

我遇到了基本相同的问题,我最终解决这个问题的方法是在GitHub上查找示例代码。结果证明这个项目很有帮助。有些与rushikesh的答案非常相似:

    def connect_relay(self):
        address = self.path.split(':', 1)
        address[1] = int(address[1]) or 443
        try:
            s = 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()

        conns = [self.connection, s]
        self.close_connection = 0
        while not self.close_connection:
            rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
            if xlist or not rlist:
                break
            for r in rlist:
                other = conns[1] if r is conns[0] else conns[0]
                data = r.recv(8192)
                if not data:
                    self.close_connection = 1
                    break
                other.sendall(data)

您可以在回购协议中找到更多信息。

有关正确使用CONNECT的信息,请参阅tl;dr版本,
CONNECT
基本上在客户端和源服务器之间建立了一个隧道。您需要使用I/O多路复用(例如使用
select
模块或类似Twisted的东西)来正确实现这一点;但在我的例子中,握手在客户端hello、服务器hello和服务器证书(交换服务器密钥)之后中途停止。。。clinet发送了客户端密钥交换和密码规范更改请求,但令人惊讶的是,该请求没有到达代理,或者代理吃掉了该消息。我被困在那里。如果您已经进一步实现了HTTPS代理,那么您是否介意分享您如何克服您在帖子中提到的问题的经验?谢谢,Sambay你的问题和我的问题很相似:你能帮我解决我的问题吗?