如何通过python';发布超过64K的数据;Http请求方法?
如果我这样做:如何通过python';发布超过64K的数据;Http请求方法?,python,http,httplib2,Python,Http,Httplib2,如果我这样做: h = httplib2.Http(timeout=60) resp, content = h.request(uri, method=method, body=body, headers=headers, redirections=redirections, connection_type=connection_type) 如果正文超过64K,则数据似乎被截断 这是在32
h = httplib2.Http(timeout=60)
resp, content = h.request(uri, method=method, body=body, headers=headers,
redirections=redirections,
connection_type=connection_type)
如果正文超过64K,则数据似乎被截断
这是在32位Python运行时上实现的(我认为在64位runttime上不会发生这种情况)
我如何做到这一点
问题是:
这是我第一次听说。这里有一个简短的程序来说明这对我是有效的。请注意,我运行的
full.cgi
脚本只是将请求头和请求体返回到响应体中。当我运行此程序时,将包含完整的64K+内容,包括“结束”往返
import httplib2
h = httplib2.Http(timeout=60)
body = "x"* (64*1024) + " the end"
uri="http://bitworking.org/projects/httplib2/test/reflector/full.cgi"
resp, content = h.request(uri, method="POST", body=body)
print content
你确定你在wireshark中看到的不仅仅是TCP片段吗?这些将被截断为小于64K,但不代表完整的HTTP请求。问题与未修补的2.6.6版本有关。换句话说,它与后来修复的已知bug有关。显然,我得到了一个python的构建,它没有包含这个补丁 有关此问题的更多信息,请参阅此帖子: 补丁版本集的_POLL=0,迫使python改用select。确保您使用的python版本包含此修补程序,否则推送较大的数据块将挂起 另一个解决方案是重写httplib.py的send方法,以捕获“35”异常并重新发送数据 下面是一些说明这一点的代码:
blen = len(str)
bleft = len(str)
bpos = 0
bsize = 1024*8
while bleft > 0:
bend = bpos + bsize
if bend >= blen:
bend = blen
try:
slen = self.sock.send(str[bpos:bend])
except socket.error, v:
if v.args[0] == 35: # unavailable
#print('socket unavailable')
slen = 0
time.sleep(.5)
else:
raise
bleft -= slen
bpos += slen
代替self.sock.sendall你为什么说“我认为它不会在64位运行时发生”?你真的测试过吗?您确定不是web服务器吗?64位运行时不会发生这种情况。它不是web服务器,我在请求中使用wireshark看到了被截断的数据。32/64位的差异可能是个误会,63K的数据可以工作,正好超过64K边界,它被截断了。实际上,我尝试了上面的示例,效果很好。但是将64改为70,它将不再工作,并显示出我看到的行为。您是否检查了响应的状态代码?我在日志中看到400和408个响应。顺便说一句,我用70尝试了相同的代码,它对我有效。结果代码是408。python似乎没有刷新其缓冲区,因此出现超时。这是Mac上的版本2.6.6,32位。在我的电脑上工作。