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 对象,这些对象可能不一

WebCore中的http请求信息维护_第1张图片

 

三) 其它
在这个类中,还可以通过 cachePolicy setCachePolicy allowCookies setAllowCookies WebKit http 之间建立起控制的通道


你可能感兴趣的:(WebCore中的http请求信息维护)