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
之间建立起控制的通道
相关文章推荐
- WebCore 中的 http 请求信息维护
- WebCore中的http请求信息维护(dlmu2001)
- WebCore中的http请求信息维护
- WebCore中的http响应信息维护
- WebCore中的http响应信息维护
- WebCore中的http响应信息维护(dlmu2001)
- WebCore中的http响应信息维护
- HttpServletRequest获取请求得URL信息
- Java http 请求/响应信息解析
- HttpWebRequest post请求获取webservice void数据信息
- HTTP响应头信息和请求头信息详解
- HTTP响应头和请求头信息对照表
- HTTP响应头和请求头信息对照表
- HTTP响应头和请求头信息对照表
- HTTP请求模型和头信息参考
- HTTP响应头和请求头信息对照表
- HTTP请求和头信息与HTML页面元信息标签解析(一)
- HTTP响应头信息和请求头信息详解
- HTTP请求header信息讲解
- HTTP响应头和请求头信息对照表