簡體   English   中英

編碼的Http請求/響應正文

[英]Encoded Http Request/Response body

我建立了一個使用Java套接字傳遞http請求和響應的Android代理服務器。

代理正在工作,瀏覽器中的所有內容都通過它。 但是我可以讀取請求/響應,但它們的主體似乎已編碼:

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

但是,我在嘗試ungzip時出錯。

未知格式(魔術數5448)

我嘗試將您的示例請求保存到“ / tmp / req”,然后使用cat /tmp/req | nc m.onet.pl 80重放它cat /tmp/req | nc m.onet.pl 80 cat /tmp/req | nc m.onet.pl 80 服務器發回了一個gzip編碼的響應,我可以從響應頭中看到content-encoding: gzip 如果響應是gzip編碼的,則可以使用java.util.zip.GZIPInputStream在Java中將其解壓縮。 請注意,您的示例中的用戶代理也廣告了對“ deflate”和“ sdch”的支持,因此您也可能會獲得使用這些編碼的響應。 可以使用java.util.zip.InflaterInputStream解壓縮“ deflate”編碼。 我不知道對sdch的任何內置支持,因此您需要找到或編寫一個庫來對其進行解壓縮-有關可能的起點,請參見此另一個Stack Overflow問題:“ Java SDCH壓縮器/解壓縮器 ”。

為了解決您的問題的更新部分,即您在使用GZIPInputStream時添加了一個刺,最直接的問題是您應該僅在HTTP響應標頭結束后對流進行壓縮。 最簡單的方法是等待“ \\ r \\ n \\ r \\ n”遇到基礎InputStream(而不是Reader),然后通過單個GZIPInputStream運行從下一個字節開始的數據。 這可能適用於您給出的示例-我成功解碼了使用gunzip -c獲得的重放響應。 為徹底起見,還有其他一些問題將使它無法作為任意網站的通用解決方案,但是我認為這足以使您入門。 (一些示例:1)您可能會錯過“內容編碼”標頭,因為您將響應分為長度為buf.length的塊。 2)使用分塊編碼的響應將需要分塊。 3)保持活動狀態的響應需要您跟蹤響應何時結束而不是等待流結束。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM