Ответ 1
Убедитесь, что вы не повторно используете один и тот же объект из предыдущего соединения. Вы ударите его, как только сервер продолжит работу и сокет закроется.
Я пишу клиент 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 и почему я не могу увидеть содержимое, которое было возвращено?
Убедитесь, что вы не повторно используете один и тот же объект из предыдущего соединения. Вы ударите его, как только сервер продолжит работу и сокет закроется.
Предыдущие ответы верны, но есть и другой случай, когда вы можете получить это исключение: это если вы выполняете несколько запросов без полного чтения промежуточного ответа.
Например:
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
и т.д.
Сегодня я столкнулся с этим же исключением, используя этот код:
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, и другой запрос отправляется через один и тот же сокет.