Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过python';发布超过64K的数据;Http请求方法?_Python_Http_Httplib2 - Fatal编程技术网

如何通过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位。在我的电脑上工作。