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:Python25libhttplib.py", line 918, in getresponse
    raise ResponseNotReady()
httplib.ResponseNotReady

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

5 31

5 ответов:

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

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

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

Например:

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

И так далее.

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

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

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

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