摘要: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**是否進行進一步分類比較好?)
版權聲明:本文版權屬於dlmu2001,如有轉載,請註明來源於blog.csdn.net/dlmu2001,謝謝。