Wie ist eine HTTP-multipart "Content-length" - header-Wert berechnet?
Ich gelesen habe, zwiespältig und zweideutig Antworten auf die Frage "Wie ist ein multipart-HTTP-request content-length berechnet?". Speziell Frage ich mich:
- Was ist der genaue Inhalt Bereich für die "Content-length" - header berechnet wird?
- Sind CRLF ("\r\n") Oktett-Sequenzen gezählt als ein oder zwei Bytes?
Kann jemand ein klares Beispiel um diese Fragen zu beantworten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den folgenden live-Beispiel sollte hoffentlich die Fragen beantworten.
Durchführen multipart-request mit Google OAuth 2.0 Playground
Google OAuth 2.0 Playground web-Seite ist ein ausgezeichneter Weg, um führen Sie eine multipart-HTTP-Anfrage an die Google Drive cloud. Sie müssen nicht verstehen, etwas über Google Drive zu tun-ich werde alles tun, die Arbeit für Sie. Wir sind nur daran interessiert in der HTTP-Anfrage und-Antwort. Mit dem Spielplatz, jedoch, ermöglicht es Ihnen, zu Experimentieren mit multipart und andere Fragen beantworten, sollte die Notwendigkeit entstehen.
Erstellen, test-Datei für den Upload
Erstellte ich eine lokale text-Datei namens "test-multipart.txt", gespeichert irgendwo auf meinem Dateisystem. Die Datei ist 34 bytes groß und sieht wie folgt aus:
Öffnen Sie Google OAuth 2.0 Playground
Wir ersten öffnen von Google OAuth 2.0 Playground in einem browser über die URL https://developers.google.com/oauthplayground/:
Füllen Sie in Schritt 1
Wählen Sie das Laufwerk API v2 und die "https://www.googleapis.com/auth/drive", und drücken Sie "Autorisieren " APIs":
Füllen Sie in Schritt 2
Klicken Sie auf die "Exchange auth-code für Token":
Füllen Sie in Schritt 3
Hier geben wir alle relevanten multipart Anfrage Informationen:
Die request-und response -
Google OAuth 2.0 Playground auf wundersame Weise fügt alle erforderlichen Header, berechnet die Länge des Inhalts, generiert eine Grenze Reihenfolge, fügt die boundary-string überall dort, wo erforderlich, und zeigt uns die Antwort des Servers:
Analyse
Multipart HTTP-request war es gelungen, mit einem 200 status-code, damit die request-und response-sind die guten diejenigen, die wir angewiesen sind. Google Spielplatz eingelegt, alles, was wir benötigt, um führen Sie die multipart-HTTP upload. Sehen Sie die "Content-length" auf 352. Schauen wir uns jede Zeile nach der Leerzeile nach dem Header:
Gibt es neun (9) Linien, und ich habe Sie manuell Hinzugefügt haben, "\r\n" am Ende eines jeden der ersten acht (8) Zeilen (aus Gründen der Lesbarkeit). Hier sind die Anzahl von Bytes (Zeichen) in jeder Zeile:
Die Summe der Bytes ist 344 und unter Berücksichtigung jedes '\r\n' als ein einzelnes ein-Byte-Sequenz gibt uns den begehrten Inhalt Länge von 344 + 8 = 352.
Zusammenfassung
Zusammenfassung der Ergebnisse:
considering each '\r\n' as a single one-octet
- das ist komplett falsch.Content-Length
ist die Anzahl der bytes, Folgen Sie den Kopfzeilen. DassOpen Google's OAuth 2.0 Playground
hat eindeutig ein Fehler und vielleicht nutzt '\n' statt '\r\n " für neue Linien.Content-Length
sollte360
, richtig?\r\n
wird, zählt als zwei bytes.Wie berechnen Sie
Content-Length
hängt nicht von den status-code oder den media-Typ der payload; es ist die Anzahl der bytes auf der Leitung. So verfassen Sie Ihren multipart-Antwort, die Anzahl der bytes (undCRLF
zählt als zwei) und verwenden Sie diese fürContent-Length
.Finden Sie unter: http://httpwg.org/specs/rfc7230.html#message.body.length
Wenn eine http-Nachricht hat
Content-Length
- header, wird dieser header gibt die genaue Anzahl von bytes, die Folgen nach dem HTTP-Header. Wenn etwas beschlossen, um frei zu zählen\r\n
als ein byte, dann würde alles auseinander fallen: keep-alive " von http-verbindungen würden aufhören zu arbeiten, als HTTP-stack wäre nicht in der Lage, um zu sehen, wo die nächste HTTP-Nachricht beginnt und würde versuchen zu analysieren zufällige Daten, als ob es eine HTTP-Nachricht.