2010-06-10 68 views
2

我通過nio.SocketChannel使用HTTP,所以我得到的數據塊大小爲Array[Byte]。我想把這些塊放到一個解析器中,並在每個塊放好之後繼續解析。解析HTTP - Bytes.length!= String.length

HTTP本身似乎使用ISO8859字符集,但Payload/Body本身可以任意編碼: 如果HTTP Content-Length指定X字節,則UTF8解碼的Body可能具有更少的字符(1個字符可能是以2個字節以UTF8表示,等等)。

那麼什麼是一個很好的解析策略,以表彰一個明確指定的Content-Length和/或Transfer-Encoding:Chunked,它指定了要被尊重的塊長度。

  • 追加每個數據塊到mutable.ArrayBuffer[Byte],搜索CRLF中的字節,直到CRLF解碼了從0到字符串,匹配常規表達式就像StatusRegex,HeaderRegex等?
  • 使用適當的字符集(例如iso8859,utf8等)解碼每個數據塊並添加到StringBuilder。有了這個解決方案,我無法兌現任何內容長度或塊大小,但是..我必須關心它嗎?
  • 任何其他解決方案...?

回答

0

我積累了ArrayBuffer中的所有Array [Byte],它允許我計算字節數。 HTTP協議解碼(狀態+標題)是通過搜索CRLF位置然後解碼0直到CRLF與ISO8859完成。

分塊的實體在ArrayBuffer中累積,並且只有在塊已經完全保存在ArrayBuffer中時才使用指定的charset進行解碼。如果解碼在2字節字符中間正確分割的utf8數據,則會繞過CharsetDecoder的MALFORMED異常。

對於流式HTML,我還沒有很好的解決方案,正常的HTML緩存在ArrayBuffer中,並在收到整個文檔(如塊)後進行解碼。

1

您可以使用UTF-16,它是Java的內部字符串表示形式。每個角色都有2個字節,除非有代理。因此,您可以掃描字符串中的代理字符長度,並根據需要對它們進行解釋,然後複製子字符串。

+0

感謝您的提示,將需要尋找這些替代品... 目前我有嚴重的問題正確使用CharsetDecoder,它不時拋出MALFORMED [1]。我的嘗試在那裏:http://github.com/hotzen/Thesis/blob/master/src/dataflow/io/http/Parser.scala#L416 欣賞任何評論。 – hotzen 2010-06-11 10:03:41