解压缩一个gzipped的http响应

8

大家好,我是Java开发者。我收到以下带有头和正文的响应,但当我尝试使用下面的代码进行解压缩时,会出现以下异常:

java.io.IOException: Not in GZIP format

响应:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Encoding: gzip
Server: Jetty(6.1.x)
▼       ═UMs¢0►=7┐ép?╙6-C╚$╢gΩ↓╟±╪₧∟zS╨╓╓♦$FÆ╒÷▀G┬╚╞8N≤╤Cf°►╦█╖╗o↨æJÄ+`:↓2
♣»└√S▬L&?∙┬_)U╔|♣%ûíyk_à\,æ] hⁿ?▀xΓ∟o╜4♫ù\#MAHG?┤(Q¶╞⌡▌Ç?▼ô[7Fí¼↔φ☻I%╓╣Z♂?¿↨F;x|♦o/A╬♣╘≡∞─≤╝╘U∙♥0☺æ?|J%à{(éUmHµ %σl┴▼Ç9♣┌Ç?♫╡5╠yë~├╜♦íi♫╥╧
╬û?▓ε?╞┼→RtGqè₧ójWë♫╩∞j05├╞┘|>┘º∙↑j╪2┐|= ÷²
eY\╛P?#5wÑqc╙τ♦▓½Θt£6q∩?┌4┼t♠↕=7æƒ╙?╟|♂;║)∩÷≈═^╛{v⌂┌∞◄>6ä╝|

代码:

byte[] b=  IOUtils.toByteArray(sock.getInputStream());

ByteArrayInputStream bais = new ByteArrayInputStream(b);
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader in = new BufferedReader(reader);

String readed;
while ((readed = in.readLine()) != null) {
    System.out.println("read:  "+readed);
}

请指教。

谢谢,

Pradeep


什么是 sock?如果它是一个套接字,你应该知道头文件和一些其他的东西并没有被压缩。只有响应体被压缩了。 - Svetlin Zarev
3个回答

2

MIME头并不是GZIP格式,而是普通文本。在解压缩流之前,您必须首先阅读它。

另外,为什么不直接使用以下内容:

InputStream in = sock.getInputStream();
readHeader(in);
InputStream zin = new GZIPInputStream(in);

你能告诉我读取头部是什么意思吗?请阅读readHeader(in); - Bill
1
我的意思是当你获取一个文件时,你会得到一个标题,其中包含诸如“Content-type: text/html”之类的信息,其中包含纯文本元数据。每个元数据元素由换行符分隔,整个标题以两个换行符结尾,然后数据开始。http://en.wikipedia.org/wiki/MIME#MIME_headers - Leo Izen

1

0

我支持bmarguiles的回答。

只有正文部分(RFC中的response-body)被压缩,因此您只需要解压缩\r\n\r\n之后的部分。

一般来说,您可以通过双CRLF将响应分成两半,并仅解压缩第二半。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接