2017-05-05 92 views
0

我正在做一個http代理,並且在客戶端向服務器發出請求之後遇到了服務器解壓縮的問題。解壓縮GZIP http請求,它有幾個部分

E.g. 客戶端發送得到https://stackoverflow.com/questions/some_question。 服務器在幾個部分發送響應。 我使用以下方法解壓縮響應部分。

public static void gzipToString(ByteBuf buf) throws IOException { 
     Reader reader = null; 
     reader = new InputStreamReader(new GZIPInputStream(new ByteBufInputStream(buf))); 

     while (true) { 
      int ch = reader.read(); 
      if (ch==-1) { 
       break; 
      } 
      System.out.print((char)ch); 
     } 
    } 

在響應的第一部分,我得到

<!DOCTYPE html> 
<html itemscope itemtype="http://schema.org/QAPage"> 

<head> 

<title>java - GZIPInputStream to String - Stack Overflow</title> 
    <link rel="shortcut icon" href="https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico?v=4f32ecc8f43d"> 
    <link rel="apple-touch-icon image_src" href="https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a"> 
    <link rel="search" type="application/opensearchdescription+xml" title="Stack Overflow" href="/opensearch.xml"> 
    <meta name="twitter:card" content="summary"> 
    <meta name="twitter:app:id:googleplay" content="comjava.io.EOFException: Unexpected end of ZLIB input stream 

在某些時候,我得到comjava.io.EOFException:ZLIB輸入流意外結束

響應的其餘部分將區分下面的例外在這條線

reader = new InputStreamReader(new GZIPInputStream(new ByteBufInputStream(buf))); 



java.util.zip.ZipException: Not in GZIP format 
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:165) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:79) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:91) 
    at com.verizon.ga.filter.ProxyHttpFilters.gzipToString3(ProxyHttpFilters.java:143) 
    at com.verizon.ga.filter.ProxyHttpFilters.serverToProxyResponse(ProxyHttpFilters.java:73) 

事實上,第一個響應我得到EOF異常使我認爲要正確解壓 響應,我需要將響應的所有部分放在一起。

但由於某些原因,所有其他部分返回不是GZIP格式。 據我所知,只有第一部分有GZIP標題。和其他人,而GZIP壓縮,沒有頭。

我該怎麼辦呢?

回答