2017-05-05 28 views
0

httpプロキシを実行しているときに、クライアントがサーバーに要求した後にサーバーからの応答の解凍に問題が発生しました。GZIP HTTPリクエストの一部を解凍します。

など。 クライアントはhttps://stackoverflow.com/questions/some_questionを送信します。 サーバーはいくつかの部分で応答を送信します。 私は以下の方法を使って応答部分を解凍します。 ZLIB入力ストリームの予期しない終わり

応答の残りの部分は小文字になります。応答の最初の部分で

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); 
     } 
    } 

私はcomjava.io.EOFExceptionを取得するいくつかの点で

<!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 

を取得しますこの行の例外を除いて

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圧縮されている間はヘッダーがありません。

どうすればいいですか?

答えて

0

ByteBufの前にGZIPInputStreamをスラップすることはできません。GZIPInputStreamは完全なInputStreamで動作します。私の答えはこちらをご覧ください:https://stackoverflow.com/a/48047974/839733

関連する問題