【问题标题】:get http raw (unparsed) response in http.client or python-requests在 http.client 或 python-requests 中获取 http 原始(未解析)响应
【发布时间】:2019-04-22 13:59:50
【问题描述】:

我正在使用 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-requests 中,我尝试了 response.raw,但它不是原始 HTTP 响应,它只是原始正文。

有什么方法可以在不使用socket的情况下实现这个目标?

附:我不想使用已解析的部分重建原始响应。

【问题讨论】:

  • 那么您对“原始响应”的理解是什么?标题部分?这不能以原始形式提供。
  • @MartijnPieters 我上面提到的格式。
  • 所以您只需要 HTTP 标头,而不是正文,对吗?
  • @MarkStewart 不。我需要所有上述格式的回复。
  • @JudaXovex:这是状态行、标题和正文。状态行和标题不以原始形式提供。

标签: python http python-requests


【解决方案1】:

requests 没有原始格式的状态行和标题。您永远不需要原始形式的这些,可以从您拥有的数据中轻松重建符合 RFC 的响应。 requests 使用 urllib3 library 作为其基础,而该库又使用 Python 标准库 http.client module。该模块不会为您提供原始数据

相反,状态行和标题被直接解析为组成部分,在http.client.HTTPResponse._read_status()http.client.parse_headers()(后者委托给email.parser.Parser().parsestr() method 将标题解析为http.client.HTTPMessage() instance)。仅使用这些解析操作的结果。

您可以尝试包装 urllib3 连接对象(通过在 requests transport adapter 上实现的 get_connection() hook)。连接对象有一个 .connect() method with supporting methods 来创建套接字对象,如果您将它们包装在一个类似文件的对象中,然后查看 .readline() 调用数据,您可以在其中捕获和存储原始数据。

但是,如果您正在调试一个损坏的 HTTP 服务器,我不会费心尝试将requests 及其堆栈在这里按照您的意愿进行调整。只需在命令行上使用curl --include --raw &lt;url&gt;(可能添加--verbose)。

另一种选择是直接使用http.client 库,建立连接,使用HTTPConnection.request() 发送您的传出标头,然后使用getresponse(),而是直接从conn.sock 读取.

【讨论】:

  • 你说你从不需要原始形式的这些,但我需要,因为我需要分析 HTTP 响应格式。
  • @JudaXovex: 那么response 可能不是您需要的库。或基于http.client 的任何其他库。
  • 有替代库吗?
  • @JudaXovex:为什么不直接使用curl command line
  • 请求太多,执行外部命令不是太快。
猜你喜欢
  • 2012-02-13
  • 2011-10-10
  • 2020-10-04
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2016-01-21
相关资源
最近更新 更多