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::dispatchDecidePolicyForM IMEType
à….
à 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,谢谢。

你可能感兴趣的:(WebCore中的http响应信息维护)