WebCore中的http响应信息维护

在“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;

ResourceResponseBase 类的成员函数大多是用来维护上述成员变量。

响应头部以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**是否进行进一步分类比较好?)


版权声明:本文版权属于dlmu2001,如有转载,请注明来源于blog.csdn.net/dlmu2001,谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值