web-dev-qa-db-fra.com

Python httplib ResponseNotReady

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é?

31
directedition

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.

37
hcalves

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.

54
Bokeh

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.

2
Chris

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.

1

Cela peut également se produire si un pare-feu bloque la connexion.

0
Tommy