簡體   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