Подтвердить что ты не робот

Python httplib ResponseNotReady

Я пишу клиент 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 и почему я не могу увидеть содержимое, которое было возвращено?

4b9b3361

Ответ 1

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

Ответ 2

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

Например:

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

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

и т.д.

Ответ 3

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

    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 возникает, потому что я еще не отправил запрос.

Ответ 4

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