gpt4 book ai didi

java - 编码的 Http 请求/响应正文

转载 作者:行者123 更新时间:2023-12-02 04:16:55 25 4
gpt4 key购买 nike

我构建了一个 Android 代理服务器,使用 Java 套接字传递 http 请求和响应。

代理正在工作,浏览器中的所有内容都通过它传递。不过,我可以读取请求/响应,但它们的正文似乎已编码:

GET http://m.onet.pl/ HTTP/1.1
Host: m.onet.pl
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 4.4.4; XT1039 Build/KXB21.14-L1.56) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,pl;q=0.4
Cookie: onet_ubi=201509221839473724130028; onetzuo_ticket=9AEDF08D278EC7965FF6A20BABD36EF0010012ED90FDD127C16068426F8B65A5D81A000000000000000050521881000000; onet_cid=dd6df83b3a8c33cd497d1ec3fcdea91b; __gfp_64b=2Mp2U1jvfJ3L9f.y6CbKfJ0oVfA7pVdBYfT58G1nf7T.p7; ea_uuid=201509221839478728300022; onet_cinf=1; __utma=86187972.1288403231.1442939988.1444999380.1445243557.40; __utmb=86187972.13.10.1445243557; __utmc=86187972; __utmz=86187972.1442939988.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

所以在请求和响应中都会出现很多“���”。我没有找到任何有关http编码的信息。它是什么 ?如何正确阅读正文?

<小时/>

假设它可能是我尝试过的 GZIP 消息:

while ((count = externalServerInputReader.read(buf, 0, buf.length)) != -1)
{
String stream = new String(buf, 0 , count);
proxyOutputStream.write(buf, 0, count);

if (stream.contains("content-encoding: gzip")) {
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader in = new BufferedReader(reader);

String readed;
while ((readed = in.readLine()) != null) {
Log.d("Hello", "UnGzip: " + readed);
}
}
}
proxyOutputStream.flush();

但是我在解压尝试时遇到错误。

unknown format (magic number 5448)

最佳答案

我尝试了您的示例请求,将其保存到“/tmp/req”并使用 cat/tmp/req | 重播它。 nc m.onet.pl 80。服务器发回了一个 gzip 编码的响应,我可以从响应头 content-encoding: gzip 中看出这一点。如果响应是 gzip 编码的,您可以使用 java.util.zip.GZIPInputStream 在 Java 中对其进行解压缩。请注意,您示例中的用户代理也正在宣传对“deflate”和“sdch”的支持,因此您也可能会收到使用这些编码的响应。 “deflate”编码可以使用 java.util.zip.InflaterInputStream 解压缩。我不知道对 sdch 有任何内置支持,因此您需要找到或编写一个库来解压缩它 - 请参阅另一个 Stack Overflow 问题以获取可能的起点:“Java SDCH compressor/decompressor ”。

为了解决问题的更新部分,您添加了使用 GZIPInputStream 的尝试,最直接的问题是您应该仅在 HTTP 响应 header 结束后对流进行压缩。最简单的做法是等待“\r\n\r\n”遇到底层输入流(不是读取器),然后通过单个 GZIPInputStream 从下一个字节开始运行数据。这可能适用于您给出的示例 - 我成功解码了使用 Gunzip -c 得到的重播响应。为了彻底起见,还有一些其他问题会阻止它作为任意网站的通用解决方案,但我认为这足以让您开始。 (一些示例:1)您可能会错过“内容编码” header ,因为您将响应拆分为长度为 buf.length 的 block 。 2) 使用分块编码的响应需要进行分块。 3) 保持 Activity 响应需要您跟踪响应何时结束,而不是等待流结束。)

关于java - 编码的 Http 请求/响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211106/

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