httplib: неполное чтение - PullRequest
       16

httplib: неполное чтение

2 голосов
/ 08 сентября 2010

У меня есть немного кода Python на стороне клиента и сервера. Я получаю исключение IncompleteRead, которое, по-видимому, не имеет веских причин. Я могу перейти к URL с помощью Firefox без какого-либо сообщения об ошибке, а также отправить его без каких-либо странных результатов.

Код сервера:

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 ]

1 голос
/ 08 сентября 2010

Проблема в баге в Apache.

Apache генерирует эту конкретную ошибку, когда принимающий скрипт не использует весь запрос POST.

Разработчики Apache считают это разработанным проектом.

Исправлено: как можно скорее this :

workaround = cgi.FieldStorage()
1 голос
/ 08 сентября 2010

Означает ли окончание строк с \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
0 голосов
/ 01 мая 2012

Я предполагаю, что оригинальный постер фактически выполнял запрос дважды, в первый раз он выполнялся, а во второй - сбой.

Я получил 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 документация ) ответ похож на файл, просто закройте его, поэтому для моего примера,

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)
...
0 голосов
/ 01 мая 2012

Я получил эту ошибку, когда мне не удалось полностью прочитать предыдущий ответ, например:

# 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 по первому запросу!

Я читаю между строк, что оригинальный сценарий Павла вошел в два сайта и получил проблему на втором сайте.

Я вижу, как читают две страницыпараллельно может быть хорошей особенностью.Так что я могу сделать, чтобы изящно сказать серверу: «Больше нет, спасибо?»Я решил это, прочитав и проигнорировав остальную часть первого запроса (в данном случае только 200 КБ).

Если бы мне было позволено комментировать, а не отвечать, я бы спросил Пола Натана,

Что такое

workaround = cgi.FieldStorage()

, что вы подразумеваете под как можно скорее, и как это помогает здесь?Пожалей начинающего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...