Могу ли я переопределить заголовок узла, используя класс java HttpUrlConnection?

Я использую следующий код для открытия http-соединения в java:

 URL url = new URL("http://stackoverflow.com");
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setDoOutput(true);
 conn.setRequestMethod("GET");
 conn.setRequestProperty("Host", "Test:8080");
 conn.getOutputStream();

Однако вызов conn.setRequestProperty("Host", "Test:8080") не имеет никакого эффекта, независимо от того, в каком порядке я вызываю методы, и Host сбрасывается на целевой сервер. Есть ли способ переопределить заголовок Host без использования другой библиотеки?

ТИА Мэтт


person Matt    schedule 04.10.2011    source источник


Ответы (3)


Это работало в прошлом, но было отключено как часть исправления безопасности. Видимо без пометки в журнале изменений. На bugs.sun.com есть даже такие ошибки, как #7022056. .

Существует похожий вопрос для другого заголовка, где ответ более подробный, поэтому я просто ссылаюсь на него, а не пишу сам. :-)

Кажется, единственным обходным решением является установка sun.net.http.allowRestrictedHeaders на true или использование другой http-библиотеки, такой как уже упомянутые http://hc.apache.org/.

person Boris    schedule 17.11.2011
comment
Спасибо, System.setProperty("sun.net.http.allowRestrictedHeaders", "true") отлично работает. - person Pete Doyle; 28.12.2011
comment
Ах, просто потратил несколько часов на отладку и поиск ответа! Большое спасибо. - person XXL; 06.05.2012

Заголовок Host заполняется HttpURLConnection на основе URL. Вы не можете открыть foo.com с помощью Host=bar.com. Из RFC

Поле заголовка запроса хоста указывает интернет-хост и номер порта запрашиваемого ресурса, полученный из исходного URI, предоставленного пользователем или ссылающимся ресурсом (обычно URL-адрес HTTP).

Кстати, вы также можете попробовать http://hc.apache.org/.

person Bozho    schedule 04.10.2011
comment
Спасибо, это вполне может быть RFC-совместимым, но это не очень полезно, поскольку я пытаюсь реализовать обратный прокси-сервер, который требует изменения порта в заголовке хоста, поскольку целевой сервер ожидает сопоставления портов. - person Matt; 04.10.2011
comment
вы можете попробовать компоненты apache http - person Bozho; 04.10.2011
comment
В целом я согласен, но вам, возможно, придется подключиться к странной удаленной системе, находящейся вне вашего контроля, которая не имеет DNS-записи, но все же хочет получить правильный заголовок хоста, потому что у нее есть виртуальные хосты. К сожалению, у меня сегодня был такой случай, но я надеюсь (ради всех остальных), что они действительно редки. ;-) - person Boris; 17.11.2011

Это проблема, связанная с тем, как залп обрабатывает HTTPUrlConnection и политику повторных попыток.

Быстрое исправление для этого состоит в том, чтобы расширить класс «HurlStack» и переопределить функцию «createConnection», чтобы вернуть HTTPUrlConnection с ChunkStreamMode 0.

public class CustomHurlStack extends HurlStack {


   public CustomHurlStack(){
       super();

   }

   @Override
   protected HttpURLConnection createConnection(URL url) throws IOException {
       HttpURLConnection connection = super.createConnection(url);
       connection.setChunkedStreamingMode(0);
       return connection;
   }

}

person TheCobra    schedule 18.03.2015