解压缩GZIP http请求,它有几个部分

问题描述 投票:0回答:1

我正在做一个http代理,遇到了响应解压缩的问题,这些问题来自客户端向服务器发出请求后的服务器。

例如。客户端发送获取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)

事实上,在第一次响应时,我得到EOFException使我认为要正确解压缩响应,我需要将响应的所有部分放在一起。

但由于某种原因,所有其他部分都不以GZIP格式返回。据我所知,只有第一部分有GZIP标题。和GZIP压缩的其他人没有标题。

我该怎么办呢?

java http gzip
1个回答
0
投票

你不能在GZIPInputStream前拍击ByteBuf,这没有任何意义:GZIPInputStream在一个完整的InputStream上运作。在这里看到我的答案:https://stackoverflow.com/a/48047974/839733

© www.soinside.com 2019 - 2024. All rights reserved.