文章引用地址:http://blog.csdn.net/dlmu2001/article/details/5938480

在“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请求回调系列 

à headerCallback(html页面)
à ResourceLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
à MainResourceLoader::didReceiveResponse(const ResourceResponse& r)
à PolicyChecker::checkContentPolicy
à FrameLoaderClientQt::dispatchDecidePolicyForMIMEType
à….
à ResourceLoader::didReceiveResponse(const ResourceResponse& r)

派生资源http请求回调系列

à headerCallback
à ResourceLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
àSubresourceLoader::didReceiveResponse(const ResourceResponse& r)
à ResourceLoader::didReceiveResponse(const ResourceResponse& r)
à ResourceLoadNotifier::didReceiveResponse
à DocumentLoader::addResponse(const ResourceResponse& r)
à DocumentLoader:: m_responses.append(r)

4. 其它

MainResourceLoader::willSendRequest发起请求前会根据ResourceResponse的statusCode判断是否是重定向请求,如果是,设置缓存策略为ReloadIgnoringCacheData
当OFFLINE_WEB_APPLICATIONS宏打开,启用离线web应用功能的时候,如果服务器返回4**或者5**的响应,就载入对应的Fallback Resource(这里4**是否进行进一步分类比较好?)