2016-04-25 4 views
3

Wenn die Antwort einen Körper hat/kann Körper (dh Statuscode nicht 204 oder 304 ist), sollte es immer entweder Inhalt Länge haben oder Transfer-Encoding im Antwortheader In der Spezifikation ist es nicht sehr klar.Ist Content-Length oder Transfer-Encoding in einer Antwort obligatorisch ist, wenn es Körper hat

In meinem Szenario habe ich einen Körper ohne Inhalt Länge oder Übertragungscodierung Header, so die Locke wird halten auf der Warte no chunk, no close, no size. Assume close to signal end während andere Clients (wie Postbote) werden, um den Inhalt, ohne aufzulegen bekommen.

+0

wenn andere Kunden, dass für die Nähe, ohne warten zu tun, sie wahrscheinlich eine andere Antwort vom Server erhalten ... –

+0

Der Unterschied zwischen anderen Clients und curl wird, wenn Postbote eine Anforderung sendet, fügt es die Header '" Akzeptieren: */* "," Accept-Encoding: gzip, deflate, sdch "," Akzeptieren-Sprache: en-US, en; q = 0.8 "' Wenn also die Antwort gesendet wird, sendet der Server mit 'Transfer-Encoding '. – user392919

Antwort

2

Transfer-Encoding ist ein HTTP/1.1 hinaus. Diese Version des Protokolls scheint hier relevant zu sein.

Darin heißt es über Content-Length:

es gesendet werden soll, wenn die Länge der Nachricht vor bestimmt werden kann, zu übertragen, sofern dies nicht durch die Regeln in Abschnitt 4.4 ist verboten.

Dies zeigt deutlich, dass es nicht gesendet werden muss.

Mit Transfer-Encoding die Standardzustände:

Die Transfer-Encoding für allgemeine Header-Feld gibt an, welche (falls vorhanden) Art der Transformation auf den Nachrichtentext, um angewandt worden, um sicher es zwischen dem Sender zu übertragen und Der Empfänger.

Dadurch kann das Headerfeld weggelassen werden, wenn keine Transfercodierung angewendet wird.

Daraus folgt: beide Header können gültig von einer Antwort fehlen.

In Ihrem Fall curl sagt, was es tut: Es wartet auf die Remote-Seite, um die Verbindung zu schließen, um zu wissen, dass die Daten vollständig empfangen wurden.

Sie sollten Ihre curl-Flaggen und die entsprechenden Mitteilungen von -v bieten mehr Einblick in ermöglichen, warum andere Werkzeuge scheinen auf eine bessere Vorstellung davon zu bekommen, warum es keine weiteren Daten vor EOF wurde angetroffen.

+0

Sie zitieren eine veraltete Spezifikation. –

+0

@Julian Reschke: Sie haben recht, der zitierte Text stammt aus einer älteren Version von HTTP/1.1.Da ich keine bestimmte Version beanspruche, was ist der logische Unterschied zu der zitierten Formulierung und dem Wortlaut von RFC7230, der die letzte Version ist, die ich kenne? (neben der Nummerierung der Abschnitte). Die neueste Formulierung scheint den zitierten Aussagen nicht zu widersprechen. – rpy

+0

Ich stimme zu, dass das Ergebnis dasselbe ist; aber ich glaube auch, dass die Angabe veralteter Spezifikationen vermieden werden sollte; Insbesondere für RFC 7230 wurde viel Zeit investiert, um solche Fragen zu beantworten. –

2

RFC 7230 hat eine sehr detaillierte Beschreibung dieser (siehe Section 3.3.3). Insbesondere der letzte Punkt:

  1. Ansonsten ist dies eine Antwortnachricht ohne eine Nachricht Körperlänge erklärt, so dass die Nachricht Körperlänge wird durch die Anzahl von Bytes bestimmt, die vor zu dem Server, der die Verbindung schließt.
Verwandte Themen