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.
3.
4.
5.FrameLoader
6.DocumentLoader
對應的請求是不停地在變化的(比如發生重定向),所以結構中維護了多個 ResourceRequest 對象,這些對象可能不一 樣
三)
其它
在這個類中,還可以通過
cachePolicy
,
setCachePolicy
,
allowCookies
,
setAllowCookies
在
WebKit
和
http
之間建立起控制的通道