繁体   English   中英

Python套接字模块。 连接到HTTP代理,然后在外部资源上执行GET请求

[英]Python socket module. Connecting to an HTTP proxy then performing a GET request on an external resource

首先,我了解还有其他模块,如请求更适合和更简单的使用,但我想使用套接字模块来更好地理解HTTP。

我有一个简单的脚本,执行以下操作:

客户端---> HTTP代理--->外部资源(GET Google.com)

我可以连接到HTTP代理,但是当我将google.com的GET请求标头发送到代理时,它根本不会为我提供任何响应。

#!/usr/bin/python
import socket
import sys



headers = """GET / HTTP/1.1\r\n
Host: google.com\r\n\r\n"""



socket = socket

host = "165.139.179.225" #proxy server IP
port = 8080              #proxy server port

try:
    s = socket.socket()
    s.connect((host,port))
    s.send(("CONNECT {0}:{1} HTTP/1.1\r\n" + "Host: {2}:    {3}\r\n\r\n").format(socket.gethostbyname(socket.gethostname()),1000,port,host))
    print s.recv(1096)
    s.send(headers)
    response = s.recv(1096)
   print response
   s.close()
except socket.error,m:
   print str(m)
   s.close()
   sys.exit(1)

要向代理发出HTTP请求,请打开与代理服务器的连接,然后发送HTTP代理请求。 此请求与普通HTTP请求大致相同,但包含绝对URL而不是相对URL,例如

 > GET http://www.google.com HTTP/1.1
 > Host: www.google.com
 > ...

 < HTTP response

要使用CONNECT方法打开隧道,然后在此隧道内正常进行,即进行SSL握手,然后在隧道内进行正常的非代理请求,例如

 > CONNECT www.google.com:443 HTTP/1.1
 >
 < .. read response to CONNECT request, must be 200 ...

 .. establish the TLS connection inside the tunnel

 > GET / HTTP/1.1
 > Host: www.google.com

Python 3要求对请求进行编码。 因此,扩展David的原始代码,结合Steffens的答案,这里是为Python 3编写的解决方案:

def connectThroughProxy():
    headers = """GET http://www.example.org HTTP/1.1
                Host: www.example.org\r\n\r\n"""

    host = "192.97.215.348" #proxy server IP
    port = 8080              #proxy server port

    try:
        s = socket.socket()
        s.connect((host,port))
        s.send(headers.encode('utf-8'))
        response = s.recv(3000)
        print (response)
        s.close()
    except socket.error as m:
       print (str(m))
       s.close()
       sys.exit(1) 

这允许我通过公司代理连接到example.org主机(至少对于非SSL / TLS连接)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM