httplib:未完成的读取
我在客户端和服务器端都有一些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()