-2

如果我这样做:

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 位运行时不会发生这种情况)。

我该如何做到这一点?

这是问题:

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

4

2 回答 2

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

于 2011-06-23T18:36:11.990 回答
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 请求。

于 2011-06-20T01:02:17.830 回答