Wie POST, chunked-kodierten Daten in Python
Ich versuche zu POSTEN aufgeteilte codierte Daten zu httpbin.org/post. Ich habe zwei Optionen: Anforderungen und httplib
Mit Anforderungen
#!/usr/bin/env python
import requests
def gen():
l = range(130)
for i in l:
yield '%d' % i
if __name__ == "__main__":
url = 'http://httpbin.org/post'
headers = {
'Transfer-encoding':'chunked',
'Cache-Control': 'no-cache',
'Connection': 'Keep-Alive',
#'User-Agent': 'ExpressionEncoder'
}
r = requests.post(url, headers = headers, data = gen())
print r
Mit httplib
#!/usr/bin/env python
import httplib
import os.path
if __name__ == "__main__":
conn = httplib.HTTPConnection('httpbin.org')
conn.connect()
conn.putrequest('POST', '/post')
conn.putheader('Transfer-Encoding', 'chunked')
conn.putheader('Connection', 'Keep-Alive')
conn.putheader('Cache-Control', 'no-cache')
conn.endheaders()
for i in range(130):
conn.send(str(i))
r = conn.getresponse()
print r.status, r.reason
In beiden Fällen, wenn ich Wireshark analysieren Spuren, die ich nicht sehen mehrere chunks gesendet. Stattdessen, was ich sehe, ist, dass alle Daten in einem einzigen chunk? Bin ich hier etwas fehlt?
- zum erzwingen von http.client zu senden, chunked-encoding-HTTP-body in python?
- Sind Sie sicher? Die Auswahl der einzelnen HTTP-Nachricht in Wireshark, Sie sollten in der Lage sein zu erweitern die Hypertext-Transfer-Protokoll Teil. , Die erweiterten Teil eine subheader namens 'HTTP chunked response', das Ihre Daten enthält.
- Ja, Sie haben Recht. Für einige Grund, mein Verständnis von, wie chunked-Daten angezeigt wird, auf Wireshark war fehlerhaft. Ich dachte, es erscheint immer als ein separates Paket. Vielen Dank für Ihre Zeit.
- mit httplib Sie benötigen, um drucken Sie die Länge der Stücke Zeile für Zeile, auch?
- Es funktionierte korrekt. Ich hatte erwartet, um zu sehen, separaten Spur für jede Gruppe von Blöcken auf der pcap-was nicht passieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code, den Sie gepostet sollte nicht richtig funktioniert. Der Grund, warum Sie immer noch eine erfolgreiche Antwort zurück, weil httpbin.org derzeit nicht unterstützt chunked transfer encoding. Siehe bug https://github.com/kennethreitz/httpbin/issues/102.
Wie in der post Piotr im Zusammenhang mit oben, Sie soll zu schreiben, die die Länge der einzelnen Stück in hexadezimal-und dann das Stück selbst.
Ich geschlachtet code für ein Beispiel. Die http://httpbin.org/post Endpunkt hat ein Formular, das Sie verwenden können, für die Prüfung. Das ist, wo ich generiert die
chunk1
undchunk2
form von Daten.Den Strom in wireshark werden ähnlich Aussehen wie die folgende, die ist falsch, weil es nicht gewartet (beachten Sie die nachfolgende
0
) oder die Interpretation der request-body (beachten Sie diejson: null
), die wir gesendet: