Wie wird ein HTTP-Multipart-Headerwert "Content-length" berechnet?

8

Ich habe widersprüchliche und etwas mehrdeutige Antworten auf die Frage "Wie wird eine mehrteilige HTTP-Anfrage Inhaltslänge berechnet?" gelesen. Speziell frage ich mich:

  • Was ist der genaue Inhaltsbereich, für den der Header "Content-length" berechnet wird?
  • Sind CRLF ("\ r \ n") Oktettfolgen als ein oder zwei Oktette gezählt?

Kann jemand ein klares Beispiel geben, um diese Fragen zu beantworten?

    
Moshe Rubin 14.07.2015, 12:02
quelle

3 Antworten

6

Das folgende Live-Beispiel sollte hoffentlich die Fragen beantworten.

Führen Sie eine mehrteilige Anfrage mit Google OAuth 2.0 Playground

aus

Die Google OAuth 2.0 Playground-Webseite ist eine hervorragende Möglichkeit, eine mehrteilige HTTP-Anfrage für die Google Drive-Cloud durchzuführen. Sie müssen dazu nichts von Google Drive verstehen - ich mache die ganze Arbeit für Sie. Wir sind nur an der HTTP-Anfrage und -Antwort interessiert. Mit dem Playground können Sie jedoch mit Multipart experimentieren und bei Bedarf weitere Fragen beantworten.

Erstellen Sie eine Testdatei zum Hochladen

Ich habe eine lokale Textdatei mit dem Namen "test-multipart.txt" erstellt, die irgendwo in meinem Dateisystem gespeichert ist. Die Datei ist 34 Byte groß und sieht so aus:

%Vor%

Öffne Google OAuth 2.0 Playground

Zunächst öffnen wir den OAuth 2.0-Spielplatz von Google in einem Browser unter Verwendung der URL Ссылка :

Füllen Sie Schritt 1

aus

Wählen Sie die Drive API v2 und die " Ссылка " aus und klicken Sie auf "APIs autorisieren":

Füllen Sie Schritt 2

aus

Klicken Sie auf "Exchange-Autorisierungscode für Token":

Füllen Sie Schritt 3

aus

Hier geben wir alle relevanten mehrteiligen Anfrage Informationen:

  • Setzen Sie die HTTP-Methode auf "POST"
  • Es müssen keine Header hinzugefügt werden, Google Playground fügt alles hinzu, was benötigt wird (z. B. Header, Randsequenz, Inhaltslänge)
  • URI anfordern: " Ссылка "
  • Geben Sie den Anfragetext ein: Dies sind einige JSON-Metadaten, die Google Drive benötigt, um den mehrteiligen Upload durchzuführen. Ich habe folgendes benutzt:
%Vor%
  • Wählen Sie unten im Bildschirm "Anfragetext" die Datei test-multipart.txt zum Hochladen aus.
  • Drücken Sie die Schaltfläche "Anfrage senden"

Die Anfrage und Antwort

Googles OAuth 2.0 Playground fügt auf wundersame Weise alle erforderlichen Header ein, berechnet die Inhaltslänge, generiert eine Begrenzungssequenz, fügt die Begrenzungszeichenfolge ein und zeigt uns die Antwort des Servers:

Analyse

Die mehrteilige HTTP-Anfrage ist mit einem 200-Statuscode erfolgreich abgeschlossen, so dass die Anfrage und die Antwort gut sind, auf die wir uns verlassen können. Google Playground fügt alles ein, was wir für den mehrteiligen HTTP-Upload benötigen. Sie können sehen, dass "Content-length" auf 352 gesetzt ist. Betrachten wir jede Zeile nach der Leerzeile nach den Headern:

%Vor%

Es gibt neun (9) Zeilen, und ich habe "\ r \ n" am Ende jeder der ersten acht (8) Zeilen manuell hinzugefügt (aus Gründen der Lesbarkeit). Hier sind die Anzahl der Oktette (Zeichen) in jeder Zeile:

  1. 29 + '\ r \ n'
  2. 30 + '\ r \ n'
  3. '\ r \ n'
  4. 167 + '\ r \ n'
  5. 29 + '\ r \ n'
  6. 24 + '\ r \ n'
  7. '\ r \ n'
  8. 34 + '\ r \ n' (obwohl '\ r \ n' nicht Teil der Textdatei ist, fügt Google es ein)
  9. 31

Die Summe der Oktette ist 344, und wenn wir jedes '\ r \ n' als einzelne Einoktettfolge betrachten, erhalten wir die begehrte Inhaltslänge von 344 + 8 = 352.

Zusammenfassung

Um die Ergebnisse zusammenzufassen:

  1. Die "Content-length" der mehrteiligen Anfrage wird aus dem ersten Byte der Begrenzungssequenz nach der leeren Zeile des Header-Abschnitts berechnet und setzt sich bis zum letzten Bindestrich der letzten Boundary-Sequenz fort.
  2. Die '\ r \ n'-Folgen sollten unabhängig vom Betriebssystem, auf dem Sie laufen, als ein (1) Oktett gezählt werden, nicht zwei.
Moshe Rubin 14.07.2015 12:02
quelle
4

Wie Sie Content-Length berechnen, hängt nicht vom Statuscode oder Medientyp der Payload ab; es ist die Anzahl der Bytes auf dem Draht. Also, komponieren Sie Ihre mehrteilige Antwort, zählen Sie die Bytes (und CRLF zählt als zwei), und verwenden Sie das für Content-Length .

Siehe: Ссылка

    
Mark Nottingham 21.11.2016 23:01
quelle
1

Wenn eine http-Nachricht Content-Length header hat, gibt diese Kopfzeile die genaue Anzahl der Bytes an, die nach den HTTP-Headern folgen. Wenn irgendetwas entschieden würde, \r\n als ein Byte zu zählen, dann würde alles auseinander fallen: Keep-Alive-HTTP-Verbindungen würden nicht mehr funktionieren, da HTTP-Stack nicht in der Lage wäre zu sehen, wo die nächste HTTP-Nachricht startet und zufällige Daten parsen würde als ob es eine HTTP-Nachricht wäre.

    
Pavel 18.05.2017 08:52
quelle