日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

WebCore 中的 http 請求信息維護

系統 1778 0


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.

點擊一個鏈接的時候,也會通過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對象,這些對象可能不一樣

WebCore 中的 http 請求信息維護

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

WebCore 中的 http 請求信息維護


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 尚志市| 新邵县| 大足县| 涟水县| 太康县| 五指山市| 孝感市| 清涧县| 怀化市| 望江县| 温泉县| 蓬安县| 稷山县| 长武县| 阿鲁科尔沁旗| 依安县| 靖边县| 西安市| 阿尔山市| 成都市| 荃湾区| 九江市| 原阳县| 内江市| 通城县| 成都市| 渝中区| 德州市| 微山县| 抚州市| 崇仁县| 航空| 无极县| 台中市| 昭平县| 浦江县| 阳城县| 景洪市| 枝江市| 永济市| 长丰县|