摘要:WebCore源代码分析,WebKit,dlmu2001,http模块,http响应,ResourceResponse,ResourceHandle,ResourceRequest,DocumentLoader,浏览器内核,curl

在“WebCore中的http请求信息维护”中,我们曾经简单介绍过http的原理,并分析了WebCore中对请求信息的维护,这篇文章则分析WebCore对http响应信息的维护。

1. 作用

ResourceResponse负责维护服务器返回的http响应的信息,包括http的头部、体部及其它信息。

2. ResourceResponse类分析

ResourceResponse继承自ResourceResponseBase,大部分功能在ResourceResponseBase类中实现。

FastAllocBase—>ResourceResonseBase—>ResourceResponse

ResourceResponseBase类成员变量一般由http响应的信息转换而来:


KURL m_url; String m_mimeType; long long m_expectedContentLength; String m_textEncodingName; String m_suggestedFilename; int m_httpStatusCode; String m_httpStatusText; HTTPHeaderMap m_httpHeaderFields; time_t m_lastModifiedDate; bool m_wasCached : 1; unsigned m_connectionID; bool m_connectionReused : 1; RefPtr<ResourceLoadTiming> m_resourceLoadTiming; bool m_isNull : 1;


响应头部以HTTPHeaderMap的结构存储,要查找某一个头部的值,可以参考FrameLoader::didBeginDocument函数中"X-DNS-Prefetch-Control"扩展头部的读取。

m_suggestedFilename用来设置下载的时候默认的文件名(扩展头部Content-Disposition指定)。

m_textEncodingName用来存储Charset头部,在“Webcore中文本资源编解码”一文中,我们介绍过文本编码的确定方式,这里是http头部指定的方式。

3. ResourceResponse类的维护及上下文

一个html帧对应于一个DocumentLoader,而一个html帧中,会有一个html资源,多个派生资源(image,css,object等),所以每个DocumentLoader维护一个m_response,对应于html资源,维护一个ResourceResponse数组(ResponseVector m_responses),对应于派生资源(SubresourceLoader)。

类DocumentLoader中既包含ResourceRequest对象,也包含ResourceResponse对象。DocumentLoader中封装了部分ResourceRequest和ResourceResponse的接口。

ResourceLoader类中也维护了ResourceResponse对象,在调用didReceiveResponse接口的时候会设置这个对象。

ResourceHandle类维护了ResourceResonse类对象,这是直接同http实现(curl)打交道的类,如curl的headCallback里面,会把相应的头部信息设置到这个对象中。

下面是一些函数调用系列图:


 html页面http请求回调系列


 派生资源http请求回调系列

4. 其它

MainResourceLoader::willSendRequest发起请求前会根据ResourceResponse的statusCode判断是否是重定向请求,如果是,设置缓存策略为ReloadIgnoringCacheData

当OFFLINE_WEB_APPLICATIONS宏打开,启用离线web应用功能的时候,如果服务器返回4**或者5**的响应,就载入对应的Fallback Resource(这里4**是否进行进一步分类比较好?)