![](/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.