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) ... 
  • IOError: файл недоступен в Google AppEngine 1.6.1
  • Использовать список, чтобы построить кортеж
  • Случайные строки в Python
  • Элегантная питоническая кумса
  • Как использовать Bulk API для хранения ключевых слов в ES с помощью Python
  • Образец REGEX для исключения определенной строки
  • Есть ли список всех символов ASCII в стандартной библиотеке python?
  • Cython - преобразование указателей на массивы в объекты Python
  • Python - лучший язык программирования в мире.