不知道我在这里做错了什么。当我尝试用firebug查看响应时,它只是说我需要重新加载页面以获取它的来源。我尝试使用GZIPOutputStream,但之后它只是在开头写了一些奇怪的字符,甚至没有产生有效的标题。
还尝试了其他一些随机的事情,其中没有一个能提供任何帮助,因此试验和错误,以及开明的stackoverflow智慧。
这仍然是抱怨我需要添加上下文?
好吧,我真的很累和倾斜,我的编码技巧已经堕落,只是在监视器上大喊大叫。这对于一个背景是怎么回事?
哦,我正在使用的服务器是NanoHTTPD的mod,我需要将其用于此原因。
private void sendResponse( String status, String mime, Properties header, InputStream data,boolean acceptEncoding)
{
try
{
if ( status == null )
throw new Error( "sendResponse(): Status can't be null." );
OutputStream out = mySocket.getOutputStream();
PrintWriter pw = new PrintWriter( out );
if(acceptEncoding){
out = new java.util.zip.DeflaterOutputStream(out);//tried using GZIPInputStream here
header.setProperty("Content-Encoding","deflate"); // and gzip here, worked even worse
}
pw.print("HTTP/1.1 " + status + " \r\n");
if ( mime != null )
pw.print("Content-Type: " + mime + "\r\n");
if ( header == null || header.getProperty( "Date" ) == null )
pw.print( "Date: " + gmtFrmt.format( new Date()) + "\r\n");
if ( header != null )
{
Enumeration e = header.keys();
while ( e.hasMoreElements())
{
String key = (String)e.nextElement();
String value = header.getProperty( key );
pw.print( key + ": " + value + "\r\n");
}
}
pw.print("\r\n");
pw.flush();
if ( data != null )
{
byte[] buff = new byte[2048];
while (true)
{
int read = data.read( buff, 0, 2048 );
if (read <= 0)
break;
out.write( buff, 0, read );
}
}
out.flush();
out.close();
if ( data != null )
data.close();
}
catch( IOException ioe )
{
// Couldn't write? No can do.
try { mySocket.close(); } catch( Throwable t ) {}
}
}
答案 0 :(得分:2)
创建GZIPOutputStream
时,它会在构造函数中写入标题字节。由于在编写HTTP标头之前创建了GZIPOutputStream
实例,因此在HTTP标头之前写入GZip标头。在完全编写HTTP标头后,您必须创建GZIPOutputStream
。