Python httplib ResponseNotReady - PullRequest
       24

Python httplib ResponseNotReady

33 голосов
/ 12 июля 2010

Я пишу REST-клиент для elgg с использованием python, и даже когда запрос выполняется успешно, я получаю следующее:

Traceback (most recent call last):
  File "testclient.py", line 94, in <module>
    result = sendMessage(token, h1)
  File "testclient.py", line 46, in sendMessage
    res = h1.getresponse().read()
  File "C:\Python25\lib\httplib.py", line 918, in getresponse
    raise ResponseNotReady()
httplib.ResponseNotReady

Глядя на заголовок, я вижу ('content-length', '5749'), поэтому я знаю, что там есть страница, но я не могу использовать .read (), чтобы увидеть ее, потому что возникает исключение. Что означает ResponseNotReady и почему я не вижу содержимое, которое было возвращено?

Ответы [ 6 ]

57 голосов
/ 04 июня 2012

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

Выполнение нескольких запросов без полного прочтения промежуточных ответов.

Например:

conn.request('PUT',...)
conn.request('GET',...)
# will not work: raises ResponseNotReady

conn.request('PUT',...)
r = conn.getresponse()
r.read() # <-- that's the important call!
conn.request('GET',...)
r = conn.getresponse()
r.read() # <-- same thing

и т. Д.

38 голосов
/ 13 июля 2010

Убедитесь, что вы не используете тот же объект из предыдущего соединения.Вы нажмете это, когда сервер keep-alive закончится и сокет закроется.

2 голосов
/ 07 августа 2010

Я столкнулся с тем же исключением сегодня, используя этот код:

    conn = httplib.HTTPConnection(self._host, self._port)
    conn.putrequest('GET',
        '/retrieve?id={0}'.format(parsed_store_response['id']))
    retr_response = conn.getresponse()

Я не заметил, что я использовал putrequest вместо request; Я смешивал свои интерфейсы. ResponseNotReady поднято, потому что я еще не отправил запрос.

1 голос
/ 01 мая 2015

Кроме того, подобные ошибки могут возникать, когда сервер отправляет ответ без заголовка Content-Length, что приведет к повреждению состояния HTTP-клиента, если используется Keep-Alive и другой запрос отправляется через тот же сокет.*

0 голосов
/ 12 марта 2019

Невозможно добавить комментарий к ответу @Bokeh;поскольку у меня пока нет необходимой репутации на этой платформе.

Итак, добавив в качестве ответа: ответ Bokeh мне помог.,Для нескольких ответов я хотел обработать ответ позже, поэтому пропустил, чтобы прочитать ответ.

По своему опыту я второй ответ Боке:

response.read () является обязательным послекаждый запрос.Даже если вы хотите обработать ответ или нет.

С моей точки зрения, этот вопрос был бы неполным без ответа Боке.Спасибо @ Боке

0 голосов
/ 06 февраля 2018

Это также может произойти, если брандмауэр блокирует соединение.

...