OkHttp 相关类
Feb 16, 2019
Interceptor
- RetryAndFollowUpInterceptor
用于重试和重定向,StreamAllocation也是在此初始化。主要是while拼装followUpRequest。 - BridgeInterceptor
添加Content-Type,"Transfer-Encoding", "chunked",gzip等请求头和对应的相应解析。还有cookie的处理。 - CacheInterceptor
根据CacheStrategy来处理获取缓存响应,通过getCandidate根据If-None-Match配合etag,If-Modified-Since配合lastModified等判断缓存是否有效。请求网络,是否304,更新相应缓存条件,组装响应。使用了DiskLruCache进行缓存的持久化,通过日志文件实现类似索引的功能,读写分离,写有类似事务的概念。定期清理。 - ConnectInterceptor
负责链接的建立和复用,以及连接上流的管理。 - CallServerInterceptor
连接建立后,与服务器进行数据交互,使用最终的request和最原始的response。
相关类
- StreamAllocation
连接和流的桥梁。持有RealConnection连接和HttpCodec流。通过newStream寻找合适的连接,产生合适的流。findConnection方法用于寻找合适的连接。 - RealConnection
物理连接的封装。持有rawSocket(原始socket),socket-ssl加密包装的SSLSocket。功能包括tcp的建立,协议的确定,tls连接的建立等。相应的握手也是由这两个对应平台的系统类实现。还实现了CertificatePinner,用于自定义证书指纹的验证。持有List<Reference<StreamAllocation>> allocations,表示该连接上有几条流,http1.1默认最大1.http2没限制。 - Http1Codec/Http2Codec
分别代表http1.x和http2的解码器,也相对于代表流。负责请求头,请求体的写入和响应头,响应体的读取。 - ConnectionPool
连接池,管理连接的缓存和复用。cleanupRunnable用于定期或者某些条件触发根据最大空闲连接和最大存活时间进行连接的清理。清理是根据有没有StreamAllocation还在引用RealConnection,也就是引用计数。当响应返回,在RetryAndFollowUpInterceptor中streamAllocation.release(),然后读取完response后,在Http1Codec中标记streamFinished,然后表示这个连接空闲。