Python中如何使用CONNECT HTTP动词、操作HTTP头及处理TLS/SSL?
在Python中用CONNECT方法、处理HTTP头和TLS/SSL的实用方案
嘿,你说得没错——requests和标准库的urllib确实没给CONNECT方法提供太顺手的原生支持,手动用sockets加openssl从零实现又太折腾。这里给你两个不用造轮子的方案:
1. 用httpx库(首推)
httpx是个现代的HTTP客户端库,支持HTTP/1.1和HTTP/2,原生就支持CONNECT方法,处理HTTP头和TLS/SSL配置也都很直观。
先安装它
pip install httpx
示例代码:发CONNECT请求+自定义头+SSL配置
import httpx # 自定义HTTP请求头 custom_headers = { "X-Custom-Header": "MyCustomValue", "User-Agent": "MyPythonClient/1.0" } # SSL配置示例:如果是测试环境需要禁用证书验证(生产环境别这么干!) ssl_settings = httpx.SSLConfig(verify=False) # 用Client上下文管理器,自动管理连接 with httpx.Client(headers=custom_headers, ssl=ssl_settings) as client: # 发送CONNECT请求到目标服务器/代理 resp = client.request( method="CONNECT", url="https://target.example.com:443", headers={"Host": "target.example.com"} ) # 查看响应状态和头信息 print(f"响应状态码: {resp.status_code}") print("响应头:") for k, v in resp.headers.items(): print(f" {k}: {v}")
如果需要用自签名证书验证,可以把verify参数换成证书文件路径:
ssl_settings = httpx.SSLConfig(verify="/path/to/your-ca-cert.pem")
2. 用标准库http.client(无额外依赖)
要是不想装第三方库,标准库的http.client也能实现,就是步骤稍微多一点:
示例代码
import http.client import ssl # 先连接到代理或者目标服务器 conn = http.client.HTTPSConnection("proxy.example.com", 8080) # 发送CONNECT请求,自定义头 conn.putrequest("CONNECT", "target.example.com:443") conn.putheader("Host", "target.example.com") conn.putheader("X-Custom-Header", "MyValue") conn.endheaders() # 获取CONNECT响应 resp = conn.getresponse() print(f"状态码: {resp.status}") print("响应头:") for k, v in resp.getheaders(): print(f" {k}: {v}") # 如果要继续通过这个连接发加密请求,手动用ssl包装socket ssl_sock = ssl.wrap_socket(conn.sock, server_hostname="target.example.com") # 发送GET请求示例 ssl_sock.send(b"GET / HTTP/1.1\r\nHost: target.example.com\r\n\r\n") response_data = ssl_sock.recv(4096) print("\n加密响应内容:") print(response_data.decode())
这个方法不用装额外包,但需要自己处理SSL层的包装,适合不想加依赖的场景。
总结
- 追求简单省心的话,直接用
httpx,对CONNECT的支持很友好,头和SSL配置也一步到位。 - 要纯标准库实现,就用
http.client配合ssl模块,虽然麻烦点,但不用额外安装东西。
内容的提问来源于stack exchange,提问作者McDonalds
相关产品推荐
相关产品推荐

