我在客户端和服务器端都有一些python代码。我得到一个IncompleteRead异常抛出似乎没有充分理由。我可以在没有任何错误消息的情况下使用Firefox导航到URL,也可以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"
答案 0 :(得分: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 :(得分:1)
问题是Apache中的一个错误。
当接收脚本不消耗所有POST请求时,Apache会抛出此特定类型的错误。
Apache开发人员认为这是一种“按照设计”的设计。
修复方法是尽快使用此 :
workaround = cgi.FieldStorage()
答案 2 :(得分: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”,然后是第二个请求的所有数据,然后在第一个请求时给了我IncompleteRead!
我正在阅读Paul的原始脚本登录到两个站点并在第二个站点上遇到问题的行。
我可以看到并行阅读两个页面可能是一个很好的功能。那么我该怎样才能优雅地告诉服务器“不再,谢谢?”我通过阅读并忽略第一个请求的其余部分(在这种情况下只有200K)来解决这个问题。
如果我被允许发表评论而不是回答,我会问Paul Nathan,
什么是
workaround = cgi.FieldStorage()
,你是什么意思尽快,这对它有何帮助?对初学者很遗憾。
答案 3 :(得分:0)
我猜测原始海报实际上是两次运行请求,第一次成功并且第二次失败。
当我无法完全阅读之前的响应时,我得到了IncompleteRead(来自Apache),例如:
# 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"在第二个请求,然后是第二个请求的所有数据,然后给了我IncompleteRead!在第二个for语句中发生错误(对我而言),可能是在它到达文件末尾时。
我可以想象想要同时打开两个回复进行阅读。所以问题是,我如何完成回复?即使我不需要,我是否必须阅读所有数据?不,(urllib.urlopen documentation)响应就像一个文件,只是关闭它,所以对于我的例子,
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
response1.close()
response2 = opener.open(url2)
...