2011-10-04 8 views
17

Sto utilizzando il seguente codice per aprire una connessione http in Java:È possibile sovrascrivere l'intestazione Host dove si utilizza la classe HttpUrlConnection di 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(); 

Tuttavia chiamando conn.setRequestProperty ("Host", "Test: 8080") sembra non avere alcun effetto indipendentemente da ciò che mi ordine chiamare i metodi e l'host viene reimpostato sul server di destinazione. C'è un modo per sovrascrivere l'intestazione Host senza utilizzare una libreria diversa?

TIA Matt

risposta

6

L'intestazione Host sia occupato dal HttpURLConnection in base alla URL. Non è possibile aprire foo.com con Host=bar.com. Dal RFC

Il campo request-header Host specifica il numero host Internet e la porta della risorsa che ha richiesto, come ottenuto dalla URI originale proposta dal utente risorsa o riferimento (in genere un URL HTTP)

Btw, puoi provare anche a apache http components.

+1

Grazie, può ben essere RFC compliant ma non è molto utile come lo sono io, cercando di implementare un proxy inverso che richiede che la porta sull'intestazione host venga modificata mentre il server di destinazione sta aspettando il mapping delle porte. – Matt

+0

puoi provare i componenti http Apache – Bozho

+0

Grazie, lo farò se devo. È più lavoro però. – Matt

25

Utilizzato in passato, ma disabilitato come parte di una correzione di sicurezza. Apparentemente senza una nota nel registro delle modifiche. Esistono anche bug come #7022056 su bugs.sun.com.

C'è un similar question per un'altra intestazione, in cui la risposta va più nei dettagli, quindi basta collegarlo invece di scriverlo da solo. :-)

L'unica soluzione alternativa sembra impostare sun.net.http.allowRestrictedHeaders a true o utilizzare un'altra libreria http come la già citata http components.

+6

Grazie, 'System.setProperty (" sun.net.http.allowRestrictedHeaders "," true ")' funziona alla grande. –

+0

Ah, ho appena trascorso alcune ore a eseguire il debug di questo e alla ricerca di una risposta! Grazie molto. – XXL

0

Questo è un problema con il modo in cui il volley gestisce i criteri HTTPUrlConnection e riprova.

Una soluzione rapida perché è di estendere "HurlStack" di classe e ignorare la funzione "CreateConnection" per restituire un HttpURLConnection con ChunkStreamMode di 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; 
    } 

}