gpt4 book ai didi

java - 使用 "gzip" header 时,无法让 Java 的 GZIPInputStream 从服务器读取 "Range"响应

转载 作者:行者123 更新时间:2023-12-01 14:07:27 28 4
gpt4 key购买 nike

我已经使用了一些代码一段时间来从 Web 服务器获取数据,几个月前,我添加了压缩支持,这似乎对于“常规”HTTP 响应效果很好,其中整个文件包含在回复中。但是,当我使用 Range header 时,它似乎不起作用。

这是真正起作用的代码:

    InputStream in = null;

int bufferSize = 4096;

int responseCode = conn.getResponseCode();

boolean error = 5 == responseCode / 100
|| 4 == responseCode / 100;

int bytesRead = 0;

try
{
if(error)
in = conn.getErrorStream();
else
in = conn.getInputStream();

// Buffer the input
in = new BufferedInputStream(in);

// Handle compressed responses
if("gzip".equalsIgnoreCase(conn.getHeaderField("Content-Encoding")))
in = new GZIPInputStream(in);
else if("deflate".equalsIgnoreCase(conn.getHeaderField("Content-Encoding")))
in = new InflaterInputStream(in, new Inflater(true));

int n;
byte[] buffer = new byte[bufferSize];

// Now, just write out all the bytes
while(-1 != (n = in.read(buffer)))
{
bytesRead += n;
out.write(buffer, 0, n);
}
}
catch (IOException ioe)
{
System.err.println("Got IOException after reading " + bytesRead + " bytes");
throw ioe;
}
finally
{
if(null != in) try { in.close(); }
catch (IOException ioe)
{
System.err.println("Could not close InputStream");
ioe.printStackTrace();
}
}

点击带有标题的 URL Accept-Encoding: gzip,deflate,identity 效果非常好:我可以看到服务器以压缩格式返回数据,上面的代码将其解压缩很好。

如果我随后添加 Range: bytes=0-50 header ,则会出现以下异常:

Got IOException after reading 0 bytes
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:116)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at [my code]([my code]:511)
我的代码中的

511 行是包含 in.read() 调用的行。响应包含以下 header :

Content-Type: text/html
Content-Encoding: gzip
Content-Range: bytes 0-50/751
Content-Length: 51

我已经验证,如果我不尝试解压缩响应,我实际上会在响应中得到 51 个字节......这不是服务器故障(至少我可以这么说)。我的服务器(Apache httpd)不支持“deflate”,所以我无法测试其他压缩方案(至少现在不能)。

我还尝试请求更多数据(例如目标资源中总共 751 字节中的 700 字节),但我得到了同样类型的错误。

我有什么遗漏吗?

更新抱歉,我忘记指出我正在 Linux 上使用 Apache/2.2.22。据我所知,没有任何服务器错误。我在验证从服务器检索的压缩字节时会遇到一些麻烦,因为“gzip”内容编码非常简单......例如我相信我不能只在命令行上使用“gunzip”来解压缩这些字节。不过我会尝试一下。

最佳答案

您可以使用“gunzip”来解压缩它,但请记住,前 50 个字节可能不足以让 gzip 解压缩任何内容( header 、字典等)。试试这个:wget -O- -q <URL> | head -c 50 | zcat与您的 URL 一起查看正常的 gzip 在您的代码失败的地方是否有效。

关于java - 使用 "gzip" header 时,无法让 Java 的 GZIPInputStream 从服务器读取 "Range"响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789597/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com