您的位置:首页 > 理论基础 > 计算机网络

WebCore中的http请求信息维护

2011-04-26 17:23 337 查看


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

之间建立起控制的通道

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: