我有一个Android应用程序,使用OkHttp向各种HTTP 1.1服务器发送请求。
<标题>它几乎在所有情况下都有效,但是对于没有使用CRLF换行符分隔状态行和消息体的服务器,它最终会超时。查看中间响应,看起来OkHttp正在将消息体解释为标头列表。
消息主体将始终以D3 ASCII字符开头。有可能让OkHttp处理一个"头"吗?以这个字符作为响应体开始?
<标题>尝试我尝试使用拦截器,手动将请求发送到套接字并从套接字读取,直到收到CRLF或D3(也收集StatusLine和头)。但是OkHttp需要调用Chain.proceed()(这会重复请求)。
<标题>不愉快的解决方案我的目标是用Call来解决这个问题。如果这是不可能的,看来我唯一的选择是从socket工厂手动获取一个套接字,发送请求,然后手动解析响应。
真的不愿意重新发明轮子。如有其他解决办法,我将不胜感激。
标题>标题> 标题>从未找到直接使用OkHttp修复此问题的方法。值得庆幸的是,它接受SocketFactory。我要做的是:
- 添加插座工厂
- 创建自定义套接字。
- 它有一个自定义的FilteredInputStream,覆盖所有的read方法。
- 每个read方法调用super read方法并修改字节。
- 如果
(byte)0xD6
在前两个CRLF对之前遇到,则将其替换为CR,然后将LF和D6缓冲或追加到结果(取决于方法调用)。
你不能仅仅覆盖read()
。read(byte[] b, int off, int len)
也被调用(父实现不调用read()
)
这修复了请求结构,允许它被OkHttp解析,所以框架仍然可以被利用,请求不需要直接发送。