Warum Content-Length-HTTP-header-Feld verwenden einen anderen Wert als der in Java-code?
Habe ich ein Stück Java-code zur übertragung eines byte-array in HTTP-server:
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="
+ myBoundary);
connection.setRequestProperty("Content-Length", 1024);
Habe ich dieses code-übertragung ein byte-array, dessen Größe größer als 1024. Es hat gut funktioniert. Aber die eigentliche HTTP-Nachricht (erfasst durch Wireshark) zeigt, dass der Wert des Content-Length ist die tatsächliche Größe anstelle von 1024. Warum?
Suchte ich in HTTP-Spezifikationen, fand aber keinen Hinweis. Ich habe keinerlei Transfer-Encoding oder Transfer-Codierung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vermuten, dass der
HttpURLConnection
einfach überschreibenContent-Length
header mit dem richtigen Wert, da es weiß, dass Lügen nicht gut ist 😉Und in der Tat: an den Linien 535-550 von
Sonne.net.www.Protokoll.HttpURLConnection
dieContent-Length
wird gesetzt, wenn angemessen. Dies geschieht nach die vom Benutzer angegebene Header gesetzt sind, so wird dieser Wert überschrieben werden.Und es ist richtig: wenn die Menge der Daten, die Sie übertragen, entspricht nicht den geforderten Betrag, dann werden Sie nur verwirren Sie das andere Ende.
Überprüfung der Quellcode von
Sonne.net.www.Protokoll.http.HttpURLConnection
es scheint, dass es eine Liste von überschriften, die eingeschränkt werden und wird stillschweigend ignoriert werden, wenn Sie den AufrufsetRequestProperty
.Content-Length
wird unter dieser Liste. Leider scheint dies zu sein, ohne Papiere (mindestens, ich konnte keine Dokumentation zu diesem, nur eine Diskussion über ein ähnliches problem hier).Googeln für die Bug-IDs (?) erwähnt in die Änderungen die Einführung dieser "Funktionalität" es scheint, dass diese änderung wurde eingeführt, als Reaktion auf die Sicherheitslücken CVE-2010-3541 und CVE-2010-3573 (Redhat bug zu diesem Thema).
Beschränkung kann manuell deaktiviert werden, indem der System-Eigenschaft
sun.net.http.allowRestrictedHeaders
zutrue
auf der JVM startup.Content-Length
war fest verdrahtet durch Fehler. Was verwunderlich ist mir, dass es funktioniert. Ich will wissen, warum.Content-Length
überschrieben werden, indem der richtige Wert sowieso. Ich aktualisiert meine Antwort.Diese für mich gelöst:
"- Verbindung.setFixedLengthStreamingMode(myString.getBytes().Länge);" vor die Content-Length-header.