我有一個使用 OkHttp 向各種 HTTP 1.1 服務器發送請求的 Android 應用程式。
問題
它幾乎在所有情況下都有效,但最終會在一臺服務器上超時,該服務器不使用 CRLF 換行符分隔狀態行和訊息正文。查看中間回應,OkHttp 似乎將訊息正文解釋為標頭串列。
訊息正文將始終以 D3 ASCII 字符開頭。是否可以讓 OkHttp 以該字符開頭的“標題”作為回應正文?
試過了
我嘗試使用攔截器手動將請求發送到套接字并從套接字讀取,直到收到 CRLF 或 D3(還收集 StatusLine 和標頭)。但是 OkHttp 需要呼叫 Chain.proceed() (這會復制請求)。
不愉快的解決方案
我的目標是通過電話解決這個問題。如果這是不可能的,看來我唯一的選擇是從 Socket 工廠手動獲取一個套接字,發送請求,然后手動決議回應。
真的寧愿不重新發明輪子。任何其他解決方案將不勝感激。
uj5u.com熱心網友回復:
從未找到直接使用 OkHttp 解決此問題的方法。謝天謝地,它接受一個 SocketFactory。我必須做的是:
- 添加一個套接字工廠。
- 它創建了一個自定義套接字。
- 其中有一個自定義 FilteredInputStream 覆寫所有讀取方法。
- 每個讀取方法呼叫超級讀取方法并修改位元組。
- 如果
(byte)0xD6
在前兩個 CRLF 對之前遇到,則將其替換為 CR。然后 LF 和 D6 被緩沖或附加到結果中(取決于方法呼叫)。
可悲的是,您不能只是 override read()
。read(byte[] b, int off, int len)
也被呼叫(父實作不呼叫read()
)。
這修復了請求結構,允許被OkHttp決議,所以仍然可以利用框架,不需要直接發送請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/498127.html