![](/img/trans.png)
[英]Why is Python 3 http.client so much faster than python-requests?
[英]get http raw (unparsed) response in http.client or python-requests
我正在使用 Python 来发出 HTTP 请求。 我需要看起来像这样的原始 HTTP 响应:
HTTP/1.1 200 OK
Date: Mon, 19 Jul 2004 16:18:20 GMT
Server: Apache
Last-Modified: Sat, 10 Jul 2004 17:29:19 GMT
ETag: "1d0325-2470-40f0276f"
Accept-Ranges: bytes
Content-Length: 9328
Connection: close
Content-Type: text/html
<HTML>
<HEAD>
... the rest of the home page...
在 python 请求中,我尝试了response.raw
,但它不是原始 HTTP 响应,它只是原始正文。
有没有办法在不使用socket
情况下实现这个目标?
PS我不想使用解析的部分重建原始响应。
requests
不具有原始形式状态行和头。 您永远不需要原始形式的这些,可以从您拥有的数据中轻松重建符合 RFC 的响应。 requests
使用urllib3
库作为其基础,而该库又使用 Python 标准库http.client
模块。 该模块不给你的原始数据无论是。
相反,状态行和标题被直接解析为组成部分,在http.client.HTTPResponse._read_status()
和http.client.parse_headers()
(后者委托给email.parser.Parser().parsestr()
方法将标头解析为http.client.HTTPMessage()
实例)。 仅使用这些解析操作的结果。
您可以尝试包装 urllib3 连接对象(通过在requests
传输适配器上实现的get_connection()
钩子)。 连接对象有一个.connect()
方法和创建套接字对象的支持方法,如果你将它们包装在一个类似文件的对象中,然后查看.readline()
调用数据,你可以捕获和存储原始数据那里。
但是,如果您正在调试一个损坏的 HTTP 服务器,我不会费心在这里尝试将requests
及其堆栈弯曲到您的意愿。 只需在命令行上使用curl --include --raw <url>
代替(可能添加--verbose
)。
另一种选择是直接使用http.client
库,建立连接,使用HTTPConnection.request()
发送您的传出标头,然后不使用getresponse()
而是直接从conn.sock
读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.