我試圖用tcpdump捕獲的.pcap文件解析HTTP響應消息,使用pkts.io解析捕獲文件和Apache httpcommons解析消息。解析由tcpdump - 實體捕獲的HTTP響應爲空,但是在頭部之後有數據
在解析捕獲文件,我追加每個分組的有效負載(同Packet.getPayload()
,doc獲得)是這樣的消息分成byte[] data
的一部分。
如果我打印new String(data, "UTF-8")
,我得到這個:
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 10 Apr 2015 04:00:04 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=300
Vary: Accept-Encoding
Content-Encoding: gzip
1dd
��������������S�n�0��+X_���
��q�b�a���������Ȓf�q��G�K�I��=���������χ/�rg�f�d"kʌ\�+1l���P
]�\^�@r�{�k��;pģ�7�=t� `C+5qg�
...
當我嘗試分析HTTP消息(下面的代碼),我得到的所有的頭還行,但resp.getEntity()
回報null
。
SessionInputBufferImpl inBuffer = new SessionInputBufferImpl(new HttpTransportMetricsImpl(), packet.getData().length);
InputStream inStream = new ByteArrayInputStream(packet.getData());
inBuffer.bind(inStream);
DefaultHttpResponseParser respParser = new DefaultHttpResponseParser(inBuffer);
HttpResponse resp = (HttpResponse) respParser.parse();
我在哪裏可以從這裏嘗試獲取文本的響應主體?
這兩個只適用於消息的內容,但是,不是? (也就是說,如果實體不爲空,我想包裝由'someHttpResponse.getEntity()。getContent()'返回的'InputStream'。) – Michelle
如果HTTP響應真的在* Content-編碼:gzip'和'1dd',它的格式不正確,因爲頭字段和主體之間應該有一個空行(CRLF)。如果是這樣,那麼你不應該指望它是可解析的,儘管HttpComponents應該指出一個錯誤。如果它有一個空白行,你應該得到一個實體,如果HttpComponents沒有爲你解壓並解壓縮它,你需要把東西搞定,這樣它才能做到。 – 2015-04-14 18:34:35
呵呵。我嘗試手動獲取內容,並且看到了雙重CRLF,並且可以使用封裝在gzip流中的分塊流中封裝的字節數組流進行解析。但是'HttpResponse'對象仍然爲實體返回null。 – Michelle