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

У меня есть код python как на стороне клиента, так и на стороне сервера. Я получаю исключение IncompleteRead, созданное для того, что, по-видимому, не является веской причиной. Я могу перейти к URL-адресу с 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 Solutions collect form web for “httplib: неполное чтение”

Оканчивает ли линия с помощью \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 

Проблема заключается в ошибке в Apache.

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

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

Исправление состоит в том, чтобы как можно скорее иметь что-то подобное:

 workaround = cgi.FieldStorage() 

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

 # 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() 

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

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

Я получил 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! Ошибка возникает (для меня) во втором для оператора, вероятно, когда она попадает в конец файла.

Я могу себе представить, что для чтения нужно одновременно открыть два ответа. Итак, вопрос в том, как мне закончить с ответом? Должен ли я читать все данные, даже если мне это не нужно? Нет, ( документация 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) ... 
  • Обновить объект движка приложения
  • PyCharm: «Упростите сопоставленное сочетание»
  • Python: отслеживание использования методов родительского класса
  • Используйте `__dict__` или` vars () `?
  • Избегайте двойного ввода имен классов в python
  • Зачем использовать упакованные * args / ** kwargs вместо передачи списка / dict?
  • Атрибуты модуля Python `this`
  • Нужно ли устанавливать пакеты python как root
  • Как получить / установить логический путь каталога в python
  • (Python) добавление списка в другой без скобок
  • Python - использование методов, определенных в __init__.py в модуле
  • Python - лучший язык программирования в мире.