gzip压缩不适用于我的自定义java HTTP服务器

时间:2013-11-20 19:29:02

标签: java http gzip http-compression nanohttpd

不知道我在这里做错了什么。当我尝试用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 ) {}
        }
    }

1 个答案:

答案 0 :(得分:2)

创建GZIPOutputStream时,它会在构造函数中写入标题字节。由于在编写HTTP标头之前创建了GZIPOutputStream实例,因此在HTTP标头之前写入GZip标头。在完全编写HTTP标头后,您必须创建GZIPOutputStream