webentwicklung-frage-antwort-db.com.de

Python httplib ResponseNotReady

Ich schreibe einen REST -Client für elgg mit Python, und selbst wenn die Anfrage erfolgreich ist, erhalte ich dies als Antwort:

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

Wenn ich mir den Header ansehe, sehe ich ('content-length', '5749'), also weiß ich, dass dort eine Seite ist, aber ich kann .read () nicht verwenden, um sie zu sehen, da die Ausnahme auftritt. Was bedeutet ResponseNotReady und warum kann ich den zurückgegebenen Inhalt nicht sehen?

31
directedition

Stellen Sie sicher, dass Sie nicht dasselbe Objekt aus einer vorherigen Verbindung wiederverwenden. Sie werden dies treffen, sobald der Server keep-alive endet und der Socket geschlossen wird.

37
hcalves

Vorherige Antworten sind korrekt, aber es gibt noch einen anderen Fall, bei dem Sie diese Ausnahme erhalten könnten:

Mehrere Anfragen stellen, ohne die Zwischenantworten vollständig zu lesen.

Zum Beispiel:

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

und so weiter.

54
Bokeh

Ich habe heute dieselbe Ausnahme mit diesem Code ausgeführt:

    conn = httplib.HTTPConnection(self._Host, self._port)
    conn.putrequest('GET',
        '/retrieve?id={0}'.format(parsed_store_response['id']))
    retr_response = conn.getresponse()

Ich habe nicht bemerkt, dass ich putrequest anstelle von request verwendete. Ich mischte meine Schnittstellen. ResponseNotReady wird ausgelöst, weil ich die Anfrage noch nicht gesendet habe.

2
Chris

Darüber hinaus können Fehler wie dieser auftreten, wenn der Server eine Antwort ohne Content-Length-Header sendet, die den Status des HTTP-Clients beeinträchtigt, wenn Keep-Alive verwendet wird, und eine andere Anforderung über denselben Socket gesendet wird.

1

@Bokehs Antwort kann nicht kommentiert werden. da ich auf dieser plattform noch nicht den nötigen ruf habe.

Als Antwort hinzufügen: Bokehs Antwort hat für mich funktioniert.

Ich habe versucht, mehrere Anforderungen nacheinander über dasselbe Verbindungsobjekt weiterzuleiten. Für einige der Antworten wollte ich die Antwort später verarbeiten, daher habe ich die Antwort nicht gelesen.

Aus meiner Erfahrung habe ich Bokehs Antwort gefolgt:

response.read () ist nach jeder Anfrage ein Muss. Auch wenn Sie eine Antwort bearbeiten möchten oder nicht.

Aus meiner Sicht wäre diese Frage ohne Bokehs Antwort unvollständig gewesen. Danke @Bokeh

0
Ankzz

Dies kann auch passieren, wenn eine Firewall die Verbindung blockiert.

0
Tommy