繁体   English   中英

在 http.client 或 python-requests 中获取 http 原始(未解析)响应

[英]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.

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