如何通过python的httplib2.Http请求方法发布超过64K的数据?

时间:2011-06-18 00:22:14

标签: 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位Python运行时(我不认为它发生在64位的runttime上)。

我如何做到这一点?

问题在于:

https://svn.macports.org/ticket/18376

2 个答案:

答案 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