如果我这样做:
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上)。
我如何做到这一点?
问题在于:
答案 0 :(得分:1)
我第一次听说过这个。这是一个简短的程序,表明这对我有用。请注意,我运行的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请求。
答案 1 :(得分:1)
问题与2.6.6的未修补版本有关。换句话说,它涉及一个后来修复的已知错误。显然我有一个python的构建,不包括此修复程序。
有关此问题的详情,请参阅此帖子:https://svn.macports.org/ticket/18376
修补版本设置HAVE_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