2011-10-04 42 views
17

estoy usando el siguiente código para abrir una conexión HTTP en Java:¿Puedo sobrescribir el encabezado Host donde se usa la clase HttpUrlConnection de 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(); 

Sin embargo llamando conn.setRequestProperty ("Host", "Prueba: 8080") no parece tener un efecto independientemente de lo que me pedido llame a los métodos y el host se restablece al servidor de destino. ¿Hay alguna manera de anular el encabezado de host sin utilizar una biblioteca diferente?

TIA Matt

Respuesta

6

La cabecera Host es llenado por el HttpURLConnection basado en la URL. No puede abrir foo.com con Host=bar.com. Desde el RFC

El campo de petición-cabecera Host especifica que se solicita el número de host de Internet y el puerto del recurso, como se obtiene de la URI original dado por el usuario o recurso de referencia (generalmente una URL HTTP)

Por cierto, también puedes probar apache http components.

+1

Gracias, bien puede ser RFC compatible pero no es tan útil como lo estoy, tratando de implementar un proxy inverso que requiere que el puerto en el encabezado del host se modifique, ya que el servidor de destino espera la asignación del puerto. – Matt

+0

puede probar los componentes http apache – Bozho

+0

Gracias, lo haré si es necesario. Sin embargo, es más trabajo. – Matt

25

Esto solía funcionar en el pasado, pero se ha deshabilitado como parte de una solución de seguridad. Aparentemente sin una nota en el registro de cambios. Incluso hay errores como #7022056 para esto en bugs.sun.com.

Hay un similar question para otro encabezado, donde la respuesta va más a los detalles, así que simplemente lo enlace en lugar de escribirlo yo mismo. :-)

Las únicas soluciones parecen estar configurando sun.net.http.allowRestrictedHeaders en true o utilizan otra biblioteca http como la ya mencionada http components.

+6

Gracias, 'System.setProperty (" sun.net.http.allowRestrictedHeaders "," true ")' funciona muy bien. –

+0

¡Ah, acabo de pasar unas horas depurando esto y buscando una respuesta! Muchas gracias. – XXL

0

Este es un problema con la forma en que volley maneja HTTPUrlConnection y reintenta la política.

una solución rápida para que es extender "HurlStack" clase y reemplazar la función "CreateConnection" para devolver un HttpURLConnection con ChunkStreamMode de 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; 
    } 

}

Cuestiones relacionadas