关于ZAKER 融媒体解决方案 合作 加入

Python 套接字模块 . 连接到 HTTP 代理 , 然后在外部 .

CocoaChina 10-21

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

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

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

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

#!/usr/bin/pythonimport socketimport sysheaders = """GET / HTTP/1.1Host: google.com"""socket = sockethost = "165.139.179.225" #proxy server IPport = 8080 #proxy server porttry: s = socket.socket ( ) s.connect ( ( host,port ) ) s.send ( ( "CONNECT {0}:{1} HTTP/1.1" + "Host: {2}: {3}" ) .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

要发出 HTTPS 请求 , 请使用 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

以上内容由"CocoaChina"上传发布 查看原文
相关标签 套接字模块