httplib:读不完整

时间:2010-09-08 17:17:37

标签: python

我在客户端和服务器端都有一些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"

4 个答案:

答案 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)
...