PiraLezz ha scritto:
String s = "<html><body>ciao</body></html>";
output.writeChars("HTTP/1.1 200 OK\r\n");
output.writeChars("Date: " + new Date().toString() + "\r\n");
output.writeChars("Server: me\r\n");
output.writeChars("Content-Type: text/html; charset=utf-8\r\n");
output.writeChars("Content-Encoding: gzip\r\n");
output.writeChars("Content-Length: " + s.length() + "\r\n");
output.writeChars("Connection: keep-alive\r\n");
output.writeChars(" \r\n");
output.writeChars(s);
output.flush();
Qui ci sono purtroppo troppe cose che non vanno.
1) Il date va inviato in un formato ben preciso (vedi specifiche HTTP), del tipo:
Date: Tue, 15 Nov 1994 08:12:31 GMT
Il toString() di Date fornisce la data in un formato fisso che non è assolutamente quello richiesto da HTTP.
2) Perché invii Content-Encoding: gzip mentre lo stream fisico NON è di certo gzipped?
3) Se indichi charset=utf-8, lo stream fisico dei byte deve essere l'encoding utf-8 dei caratteri. Nel tuo caso NON è così. writeChars di DataOutputStream scrive i caratteri come è indicato dal writeChar, ovvero da documentazione:
Writes a char to the underlying output stream as a 2-byte value, high byte first.
Quindi per ciascun carattere Unicode vengono inviati 16 bit, byte alto prima, poi byte basso dopo. E questo NON è UTF-8.
4) Connection: keep-alive in realtà non lo è visto che chiudi tutto.
5) Content-Length deve essere la lunghezza in
byte del body ("
octect", come è solito dire in ambito networking, che poi vuol dire appunto unità di 8 bit). Non è la lunghezza della stringa! Se la codifica in uscita fosse UTF-16 e la stringa ha 10 caratteri, il Content-Length dovrebbe essere 20. Quindi c'entra
anche la codifica!
Insomma, ci sono troppe cose inappropriate/errate. La mia impressione è che hai scopiazzato del codice di qua e di là senza comprendere bene cosa sono quegli header e come gestirli. Ti serve leggere una guida su HTTP.