使用urllib.request.Request()后,python HTTP多部分报头值已更改

k2arahey  于 2023-03-13  发布在  Python
关注(0)|答案(2)|浏览(341)

发送HTTP POST时,设置为keep-alive的报头“connection”值在传出数据包中变为“close”。
下面是我使用的标题:

multipart_header = {        
                        'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/17.0 Firefox/17.0',
                        'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                        'accept-language':'en-US,en;q=0.5',
                        'accept-encoding':'gzip, deflate',
                        'connection':'keep-alive',

                        'content-type':'multipart/form-data; boundary='+boundary,
                        'content-length':''
        }

## command to send the header: 
urllib.request.Request('http://localhost/api/image/upload', data=byte_data, headers=multipart_header)

当我捕获POST数据包时,我可以看到连接字段变成了“关闭”,而不是预期的“保持活动”。

9ceoxa92

9ceoxa921#

http://docs.python.org/dev/library/urllib.request.html表示:
request模块使用HTTP/1.1并在其HTTP请求中包含Connection:close标头。
这大概是有道理的--我假设urllib.request没有任何能力来实际存储真实的的keepalive连接的TCP套接字,所以您不能覆盖这个头。
https://github.com/psf/requests似乎支持它,尽管我没有使用过它。

f3temu5u

f3temu5u2#

urllib不支持持久连接。如果您已有要发送的标头和数据,则可以使用http.client重用http连接:

from http.client import HTTPConnection

conn = HTTPConnection('localhost', strict=True)
conn.request('POST', '/api/image/upload', byte_data, headers)
r = conn.getresponse()
r.read() # should read before sending the next request
# conn.request(...

参见Persistence of urllib.request connections to a HTTP server

相关问题