WebCore中的http請求信息維護

       WebCore 中的 http 請求信息維護(dlmu2001)

 

    WebCore 內核本身並不實現 http 協議,它通過調用不同平臺的 http , 比如 Qt QnetWorkRequest,gtk soup ,或者 curl 等,來實現 http 協議的功能。這裏將以 curl 爲例,來理解 webcore 中的請求信息維護。

    http 協議的細節,如果希望深入瞭解的話,可以參考 rfc2616 rfc2617 。簡單介紹下它的原理, http 協議遵循的是一個請求 à 響應的機制。也就是說,一個 url ,對應一個請求 à 響應鏈。而在網頁中,任何資源對應的都是一個 url 。如果客戶端想從服務器端申請一個資源,需要發起一個請求, http 的請求格式是純文本格式,如下是一個簡單的例子 :

Get /index.html   HTTP/1.1

Accept: text/html,*/*

User-Agent:mozilla/4.0

Host:www.csdn.net

Referer:www.hao123.com

Connection:Keep-Alive

 

 

以上是獲取 http://www.csdn.net /index.htm l 的請求。 Accept,User-Agent,Host,Referer,Connection 都是請求頭部的字段。

Csdn 在收到這樣一個請求以後,如果它的服務器上確實存在 test.png 這個資源,則返回 http 響應如下

HTTP/1.1 200 OK

Content-Length: 862

Date: Tue, 12 Oct 2010 06:21:46 GMT

Content-Type: text/html

ETag: "b59305a7-35e-484b91e27e9ec"

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

<head>

   <meta http-equiv="Content-Type" content="text/html;charset=gb2312">

   <title>csdn.net ,中國領先的 it 技術社區 </title>

</head>

<body>

  …………………………….

</body>

</html>

 

這樣,一個 http 請求就完成了,流程非常簡單明瞭,所以在互聯網上使用特別廣泛。由於只是一個簡單的請求 à 響應機制,所以 http 是沒有狀態這一個說法的(這同大部分協議基於狀態機的機制是不同的),當然,爲了在某些情況下,維護一個狀態, http 加入了 cookie 的管理機制,利用 cookie 來實現了一些狀態的管理。另外,爲了節約網絡流量,提高性能, http 協議中定義了 cache 的機制。

 

http 的協議細節實現並不需要 WebCore 來關注, WebCore 要關注的是,如何設置請求的相關頭部信息,如何獲取服務器返回回來的響應體部數據。

WebKit 中同 http 打交道的類主要是 ResourceRequest ResourceResonse ResourceHandle* ResourceHandleManager 等,這裏先介紹同請求信息維護相關的 ResourceRequest.

ResourceRequest 類的作用比較好理解,基本上就是維護 http 請求相關的信息( app 或者內核都有可能設置這些信息),然後當 WebCore 發起 http 請求的時候,可以獲取這些信息,調用 curl 的接口設置對應的 http 請求字段。在這些信息中,最常用到的是 url

ResourceRequest 類繼承於 ResourceRequestBase 類,絕大部分功能在 ResourceRequestBase 類中實現。

一) ResourceRequest 構造:構造一個 ResourceRequest 對象只需要 url 參數就夠了,這是比較簡單的一個類,沒有維護其它類的對象或者句柄。
ResourceRequest(const String& url)

ResourceRequest(const KURL& url)

二)ResourceRequest 對象的創建與維護


1.
當用戶輸入網址,開始一個網頁的請求的時候,會調用 QwebFrame::load 函數,在該函數中,會構造出 ResourceRequest 對象,並將這個對象作爲一個參數,調用 FrameLoader 類的 load 函數, DocumentLoader 類中會維護這個 ResourceRequest ,在調用 MainResourceLoader load 接口的時候,也會把 ResourceRequest 對象傳遞過去,在 MainResourceLoader 中維護相應的信息。當 MainResourceLoader loadNow 接口的時候,又會在創建的 ResourceHandle 的內部數據結構成員( ResourceHandleInternal d 中維護 ResourceRequest 對象。

 


2.

點擊一個鏈接的時候,也會通過 FrameLoader 類的 urlSelected 發出一個新的請求,在發起請求的時候構造出 ResourceRequest 對象。同樣也會在 DocumentLoader MainResourceLoader ResourceHandle 類中都維護 ResourceRequest 對象。

 


3.

根據資源的種類,除了 1 2 ,請求還可以分爲子楨請求(如 iframe 標籤), Css 請求, Script 請求, Image 請求, Object 請求, Media 請求, Worker 請求( HTML5 ), Prefetch 請求等,參考 ResourceRequestBase 類中的 TargetType 枚舉。

 


4.

ResourceHandleManager(/curl) 類的 initializeHandle 函數中,會通過 ResourceHandle 類來訪問 ResourceRequest 對象,獲取之前設置過的 ResourceRequest 的信息(比如 url method user-agent,referer 等),調用 curl_easy_setopt 接口,設置到 curl 裏面。

 


5.FrameLoader

類的 addExtraFieldsToRequest 接口會設置一些請求頭的信息。


6.DocumentLoader

對應的請求是不停地在變化的(比如發生重定向),所以結構中維護了多個 ResourceRequest 對象,這些對象可能不一

 

三) 其它
在這個類中,還可以通過 cachePolicy setCachePolicy allowCookies setAllowCookies WebKit http 之間建立起控制的通道


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章