2013-05-17 12 views
6

Sto utilizzando un motore servlet personalizzato di un prodotto fornitore. Il nostro server è preceduto da proxy diversi con nomi host diversi. Supponendo che i nomi host siano host1.localhost.com e host2.localhost.com.Un socket, più richiesta HTTP, intestazione host diversa ma il server restituisce l'intestazione dell'host nella cache

Abbiamo seguito servlet

public class MyServlet { 

    public void doGet(...) { 

      response.getOutputStream.write(request.getServerName().getBytes()) 
} } 

Abbiamo incontrato un problema che a volte se facciamo una richiesta host1.localhost.com/my/servlet che vediamo in realtà vediamo host2.localhost.com/my/servlet nella risposta.

La decompilazione del codice del prodotto fornitore ha rivelato che il proprio motore servlet memorizza nella cache l'intestazione Host finché il socket viene tenuto in vita.

Nel tentativo di riprodurre il problema che ho scritto un po 'di codice di basso presa livello per rendere le richieste HTTP:

Socket s = new Socket(); 
s.connect(new InetSocketAddress("host2.localhost.com", 8080)); 
OutputStream os = s.getOutputStream(); 

/*this thread keeps printing stuff in the input stream*/ 
Thread t = new ResponsePrintThread(s.getInputStream()); 
t.start() 

os.write("GET /my/servlet/testservlet HTTP/1.1\r\n".getBytes()); 
os.write("Host: 12345\r\n".getBytes()); 
os.write("\r\n".getBytes()); 
os.flush(); 

os.write("GET /my/serlet/testservlet HTTP/1.1\r\n".getBytes()); 
os.write("Host: 7891011\r\n".getBytes()); 
os.write("\r\n".getBytes()); 
os.flush(); 

È possibile che questo stamperà

12345 
12345 

Ma mi sarei aspettato

12345 
7891011 

La mia domanda è, il motore servlet si comporta correttamente memorizzando nella cache e restituendo la stessa intestazione host per la stessa connessione socket, o dovrebbe ri-analizzare le intestazioni HTTP e aggiornare l'intestazione dell'host nella cache? Il mio pensiero è che dal momento che HTTP suppone essere stateless, quindi qualsiasi informazione nella richiesta HTTP dovrebbe essere rianalizzata e ricaricata, anche l'intestazione host.

risposta

2

HTTP è un po 'vago su come i collegamenti sono realizzati tra client e server:

http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-22#section-6.2

E' oltre lo scopo di questa specifica per descrivere come connessioni sono stabilite tramite vari mezzi di trasporto o una sessione -layer protocolli.

Non vedo niente di sbagliato se un client utilizza una connessione permanente per due nomi host che si risolvono sullo stesso IP. Non dovrebbe causare alcun problema sul lato server.

Problemi correlati