在消息体之前解析响应而不包含CRLF



我有一个Android应用程序,使用OkHttp向各种HTTP 1.1服务器发送请求。

<标题>

它几乎在所有情况下都有效,但是对于没有使用CRLF换行符分隔状态行和消息体的服务器,它最终会超时。查看中间响应,看起来OkHttp正在将消息体解释为标头列表。

消息主体将始终以D3 ASCII字符开头。有可能让OkHttp处理一个"头"吗?以这个字符作为响应体开始?

<标题>

尝试我尝试使用拦截器,手动将请求发送到套接字并从套接字读取,直到收到CRLF或D3(也收集StatusLine和头)。但是OkHttp需要调用Chain.proceed()(这会重复请求)。

<标题>

不愉快的解决方案我的目标是用Call来解决这个问题。如果这是不可能的,看来我唯一的选择是从socket工厂手动获取一个套接字,发送请求,然后手动解析响应。

真的不愿意重新发明轮子。如有其他解决办法,我将不胜感激。

从未找到直接使用OkHttp修复此问题的方法。值得庆幸的是,它接受SocketFactory。我要做的是:

  1. 添加插座工厂
  2. 创建自定义套接字。
  3. 它有一个自定义的FilteredInputStream,覆盖所有的read方法。
  4. 每个read方法调用super read方法并修改字节。
  5. 如果(byte)0xD6在前两个CRLF对之前遇到,则将其替换为CR,然后将LF和D6缓冲或追加到结果(取决于方法调用)。

你不能仅仅覆盖read()read(byte[] b, int off, int len)也被调用(父实现不调用read())

这修复了请求结构,允许它被OkHttp解析,所以框架仍然可以被利用,请求不需要直接发送。

最新更新