WebCore內核本身并不實現http協議,它通過調用不同平臺的http庫,比如Qt的QnetWorkRequest,gtk的soup,或者curl等,來實現http協議的功能。這里將以curl為例,來理解webcore中的請求信息維護。
http協議的細節,如果希望深入了解的話,可以參考rfc2616,rfc2617。簡單介紹下它的原理,http協議遵循的是一個請求à響應的機制。也就是說,一個url,對應一個請求à響應鏈。而在網頁中,任何資源對應的都是一個url。如果客戶端想從服務器端申請一個資源,需要發起一個請求,http的請求格式是純文本格式,如下是一個簡單的例子:
Get /index.htmlHTTP/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.html的請求。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之間建立起控制的通道
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
