Java HttpURLConnection Restricted Headers setzen


Wer mit einer HttpUrlConnection arbeitet und dabei Headers setzten will, kann seit der Java Version 1.6.0_22 Probleme bekommen.

Seit dieser Version hat Oracle bestimmte Header als Restricted markiert.

Wenn diese Header wie folgt gesetzt werden, kann man Sie zwar setzen, aber in der Kommunikation tauchen sind diese Felder leer, bzw. werden mit Defaults befüllt.

            
URL u = new URL( "https://larshercher.de" );
HttpURLConnection uc =  (HttpsURLConnection) u.openConnection();
uc.setRequestMethod("POST");
uc.addRequestProperty("Accept", "*/*");
uc.addRequestProperty("Host", "IRGENDWAS");

In diesem Beispiel wird der Header Host nicht auf IRGENDWAS gesetzt, sondern von der JVM auf larshercher.de.

Laut Java Source dieser Klasse (http://www.docjar.com/html/api/sun/net/www/protocol/http/HttpURLConnection.java.html), werden bestimmte Header als Restricted angesehen und können nur durch eine SystemProperty frei geschaltet werden.

  
private static final String[] restrictedHeaders = {
          "Access-Control-Request-Headers",
          "Access-Control-Request-Method",
          "Connection", /* close is allowed */
          "Content-Length",
          "Content-Transfer-Encoding",
          "Host",
          "Keep-Alive",
          "Origin",
          "Trailer",
          "Transfer-Encoding",
          "Upgrade",
          "Via"
};

Wenn diese Header gesetzt werden sollen, muss der Parameter „sun.net.http.allowRestrictedHeaders“ auf true gesetzt werden.

Entweder im Code mit

System.setProperty( "sun.net.http.allowRestrictedHeaders", "true");

oder als Startparameter der JVM mit „-Dsun.net.http.allowRestrictedHeaders=true“