我正在尝试通过Java套接字发送压缩的HTML文件,但浏览器显示为空的HTML文件。
问题在于,当我尝试发送未压缩的HTML时,一切正常(是的,我确实相应地修改了HTTP标头)。
最初的回答:我正在尝试使用GZIP压缩算法将HTML文件压缩,但是我忘记在HTTP响应标头中包括Content-Encoding: gzip。因此,浏览器无法正确解压缩文件并显示内容。
基本上,headers 包含 HTTP 标头,而 body 则包含 HTML 文件。其余部分似乎不需要解释。可能是什么原因导致这种情况?
编辑:标头生成如下:
问题在于,当我尝试发送未压缩的HTML时,一切正常(是的,我确实相应地修改了HTTP标头)。
最初的回答:我正在尝试使用GZIP压缩算法将HTML文件压缩,但是我忘记在HTTP响应标头中包括Content-Encoding: gzip。因此,浏览器无法正确解压缩文件并显示内容。
private void sendResponse(String headers, String body) throws IOException
{
BufferedOutputStream output = new BufferedOutputStream(
this.SOCKET.getOutputStream());
byte[] byteBody = null;
// GZIP compression
if(body != null && this.encoding.contains("gzip"))
{
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
GZIPOutputStream zipStream = new GZIPOutputStream(byteStream);
zipStream.write(body.getBytes(this.charset));
zipStream.flush();
byteBody = byteStream.toByteArray();
byteStream.flush();
byteStream.close();
zipStream.close();
}
else
byteBody = body.getBytes(this.charset);
// Sending response
byte[] msg1 = (Integer.toHexString(byteBody.length) + "\r\n")
.getBytes(this.charset);
byte[] msg2 = byteBody;
byte[] msg3 = ("\r\n" + "0").getBytes(this.charset);
output.write(headers.getBytes(this.charset));
output.write(msg1);
output.write(msg2);
output.write(msg3);
output.flush();
output.close();
}
基本上,headers 包含 HTTP 标头,而 body 则包含 HTML 文件。其余部分似乎不需要解释。可能是什么原因导致这种情况?
编辑:标头生成如下:
headers = "HTTP/1.1 200 OK\r\n";
headers += "Date: " + WebServer.getServerTime(Calendar.getInstance()) + "\r\n";
headers += "Content-Type: text/html; charset=" + this.charset + "\r\n";
headers += "Set-Cookie: sessionID=" + newCookie + "; Max-Age=600\r\n";
headers += "Connection: close \r\n";
if(this.encoding.contains("gzip"))
headers += "Content-Encoding: gzip\r\n";
headers += "Transfer-Encoding: chunked \r\n";
headers += "\r\n";