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

2024-09-28 01:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我这样做:

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


Tags: 数据httprequesttypetimeoutbodyuricontent
2条回答

该问题与未修补的2.6.6版本有关。换句话说,它与后来修复的已知错误有关。显然,我得到了一个python构建版本,其中没有包含这个修复。在

有关此问题的详细信息,请参阅此帖子:https://svn.macports.org/ticket/18376

修补后的版本集的“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公司在

我第一次听说这个。这里有一个简短的程序来证明这对我有用。请注意,我运行的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请求。在

相关问题 更多 >

    热门问题