首先,我了解其他模块(如请求)更适合使用且更易于使用,但我想使用套接字模块来更好地理解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)
答案 0 :(得分:6)
向代理发出HTTP请求,打开与代理服务器的连接,然后发送HTTP代理请求。此请求与普通HTTP请求大致相同,但包含绝对URL而不是相对URL,例如
> GET http://www.google.com HTTP/1.1
> Host: www.google.com
> ...
< HTTP response
要使用CONNECT方法使HTTPS请求打开隧道,然后在此隧道内正常进行,即进行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
答案 1 :(得分:3)
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连接)。