Почему в поле заголовка HTTP Content-Length используется значение, отличное от значения, указанного в коде Java? - PullRequest
6 голосов
/ 19 мая 2011

У меня есть фрагмент Java-кода для передачи байтового массива на HTTP-сервер:

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);

Я использовал этот код для передачи байтового массива, размер которого больше 1024. Он работал хорошо. Но фактическое сообщение HTTP (захваченное Wireshark ) показывает, что значение Content-Length является фактическим размером вместо 1024. Почему?

Я искал в HTTP spec , но не нашел подсказки. Я не использовал кодирование передачи или кодирование передачи.

Ответы [ 2 ]

16 голосов
/ 19 мая 2011

Я бы предположил, что HttpURLConnection просто переопределит заголовок Content-Length с правильным значением, поскольку он знает , что врать об этом нехорошо; -)

И действительно: в строках 535-550 sun.net.www.protocol.HttpURLConnection при необходимости устанавливается Content-Length.Это происходит после заданных пользователем заголовков, так что это значение будет перезаписано.

И это правильно: если объем передаваемых данных не соответствует заявленному количеству,тогда вы только запутаете другой конец.

Проверка источника sun.net.www.protocol.http.HttpURLConnection кажется, что существует список заголовков, которые ограничены и будут молча игнорироваться при вызове setRequestProperty.Content-Length входит в этот список.К сожалению, это кажется недокументированным (по крайней мере, я не смог найти никакой документации по этому вопросу, только обсуждение связанной с этим проблемы здесь ).

Поиск в Google для идентификаторов ошибок (?)в ChangeSet, который представил эту «функциональность» , кажется, что это изменение было представлено как реакция на уязвимости безопасности CVE-2010-3541 и CVE-2010-3573 ( Redhat ошибка в этой теме ).

Ограничение можно вручную отключить, задав для свойства System sun.net.http.allowRestrictedHeaders значение true при запуске JVM.

0 голосов
/ 06 ноября 2018

Это решено для меня:

connection.setFixedLengthStreamingMode(myString.getBytes().length);
conn.setRequestProperty("Content-length", String.valueOf(myString.getBytes().length));

"connection.setFixedLengthStreamingMode (myString.getBytes () длина.);" перед установкой заголовка Content-Length.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...