httplib:未完成的读取

2 投票
4 回答
8629 浏览
提问于 2025-04-16 03:52

我在客户端和服务器端都有一些Python代码。现在我遇到了一个叫做IncompleteRead的错误,看起来没有什么合理的原因。我用Firefox访问这个网址时没有任何错误信息,用WGET下载也没有出现奇怪的结果。

服务器端的代码是:

import random
import hashlib
print "Content-Type: text/html"     
print                              

m = hashlib.md5()
m.update(str(random.random()))
print m.hexdigest()
print

在客户端,我使用了一种相对简单的POST方法:

    data = urllib.urlencode({"username": username,
                     "password" : password})
    #POST in the data.
    req = urllib2.Request(url, data)

    response = urllib2.urlopen(req)
    string =  response.read()

但是在执行response.read()时却抛出了错误。

补充信息:添加明确的CRLF(换行符)并没有改变这个情况。检查错误日志时发现:

[Wed Sep 08 10:36:43 2010] [error] [client 192.168.80.1] (104)Connection reset by peer: ap_content_length_filter: apr_bucket_read() failed

SSL访问日志显示(略去了一些信息):

192.168.80.1 - - [08/Sep/2010:10:38:02 -0700] "POST /serverfile.py HTTP/1.1" 200 1357 "-" "Python-urllib/2.7"

4 个回答

0

我在没有完全读取之前的响应时遇到了这个错误,比如:

# This is using an opener from urllib2, but I am guessing similar...
response1 = opener.open(url1)
for line in response1:
    m = re.match("href='(.*)'", line):
    if m:
        url2 = m.group(1) # Grab the URL from line, that's all I want.
        break             # Oops.  Apache is mad because I suck.

response2 = opener.open(url2)
for line in response2:
    print line

服务器在第一次请求时给了我“200 OK”,然后返回了我想要的链接之前的数据,接着在第二次打开时等了五分钟,然后在第二次请求时又给了我“200 OK”,接着返回了第二次请求的所有数据,最后在第一次请求时给了我不完整读取的错误!

我理解到,保罗的原始脚本登录了两个网站,并在第二个网站上遇到了问题。

我能理解同时读取两个页面可能是个不错的功能。那么我该怎么优雅地告诉服务器“够了,谢谢?”我通过读取并忽略第一次请求的其余部分解决了这个问题(在这个例子中只有20万字节)。

如果我可以评论而不是回答,我会问保罗·内森,

什么是

workaround = cgi.FieldStorage()

,你说的“尽快”是什么意思,这在这里有什么帮助?请对初学者多一点耐心。

1

在代码中用 \r\n 来结束每一行,有什么区别吗?就像这样:

import random
import hashlib
import sys

sys.stdout.write("Content-Type: text/html\r\n\r\n")

m = hashlib.md5()
m.update(str(random.random()))
print m.hexdigest()
print
1

这个问题是Apache里的一个错误。

当接收请求的脚本没有处理完所有的POST请求时,Apache就会出现这种特定的错误。

Apache的开发者认为这是按照设计来的,也就是说这是他们故意这样做的。

解决这个问题的方法是尽快做一些像这样的事情:

workaround = cgi.FieldStorage()

撰写回答