J'écris un client REST pour elgg en utilisant python, et même si la requête aboutit, je reçois ceci en réponse:
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
En regardant l'en-tête, je vois ('content-length', '5749'), donc je sais qu'il y a une page, mais je ne peux pas utiliser .read () pour le voir car l'exception se produit. Que signifie ResponseNotReady et pourquoi ne puis-je pas voir le contenu qui a été renvoyé?
Assurez-vous de ne pas réutiliser le même objet à partir d'une connexion précédente. Vous frapperez ceci une fois que le serveur keep-alive se terminera et que le socket se fermera.
Les réponses précédentes sont correctes, mais il existe un autre cas où vous pourriez obtenir cette exception:
Faire plusieurs demandes sans lire complètement les réponses intermédiaires.
Par exemple:
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
etc.
Je courais dans cette même exception aujourd'hui, en utilisant ce code:
conn = httplib.HTTPConnection(self._Host, self._port)
conn.putrequest('GET',
'/retrieve?id={0}'.format(parsed_store_response['id']))
retr_response = conn.getresponse()
Je n'ai pas remarqué que j'utilisais putrequest
plutôt que request
; Je mélangeais mes interfaces. ResponseNotReady
est déclenché parce que je n'ai pas encore envoyé la demande.
En outre, des erreurs de ce type peuvent se produire lorsque le serveur envoie une réponse sans en-tête Content-Length, ce qui paralysera l'état du client HTTP si Keep-Alive est utilisé et qu'une autre demande est envoyée sur le même socket.
Cela peut également se produire si un pare-feu bloque la connexion.