项目地址:
本文实现的文件在源码中的SimpleWebServer/http_parser
目录下
本文内容
- 目标:解析HTTP报文,从而获取客户请求的文件的文件名及文件地址
- 浏览器与服务器间的通信过程
- URL与URI
- HTTP协议
- HTTP请求报文
- 解析HTTP请求报文
浏览器与服务器间的通信过程
URL和URI
URL:(Uniform Resource Locator)统一资源定位符
URI:(Uniform Resource Identifier)就是某个协议方案表示的资源的定位标识符。协议方案是指访问资源锁使用的协议类型名称。采用HTTP协议时,协议方案就是HTTP。
URI有很多的格式,这里我们仅介绍绝对URI格式
HTTP协议
HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
下面来看一个具体的示例
先看客户的请求。下面是客户端发送给某个HTTP服务器端的请求报文中的部分内容。图中所示,客户请求服务器上的文件“562f25980001b1b106000338.jpg”
请求报文
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host:img.mukewang.com
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept:image/webp,image/*,*/*;q=0.8
Referer:http://www.imooc.com/
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
空行
请求数据为空
请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。
GET说明请求类型为GET,/562f25980001b1b106000338.jpg(URL)为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息。
- HOST,给出请求资源所在服务器的域名。
- User-Agent,HTTP客户端程序的信息,该信息由你发出请求使用的浏览器来定义,并且在每个请求中自动发送等。
- Accept,说明用户代理可处理的媒体类型。
- Accept-Encoding,说明用户代理支持的内容编码。
- Accept-Language,说明用户代理能够处理的自然语言集。
- Content-Type,说明实现主体的媒体类型。
- Content-Length,说明实现主体的大小。
- Connection,连接管理,可以是Keep-Alive或close。
空行,请求头部后面的空行是必须的即使第四部分的请求数据为空,也必须有空行。
请求数据也叫主体,可以添加任意的其他数据。
解析请求报文
在此Web服务器中,我们仅支持GET请求方法的解析,并且我们仅关心请求行的内容。
用状态机解析HTTP请求
我们使用状态机来解析HTTP请求
图片来自社长的最新版Web服务器项目详解 - 05 http连接处理(中)
我们的代码中有2个状态机,分别称为主状态机和从状态机:主状态机在内部调用从状态机
从状态机:即parse_line函数
它从m_read_buf
中解析出一个行
这个状态机的初始状态是LINE_OK
,其原始驱动力来自于m_read_buf
中新到达的客户数据。在test
函数中,我们传入待测试的HTTP请求,再调用parse_read
函数来分析读入的数据,parse_read
函数首先要做的就是调用parse_line
函数来获取一个行,获取一行内容后,parse_line
函数就可以将这行内容递交给parse_content
函数来处理这部分数据
具体的流程分析可以看《Linux高性能服务器》的8.3节或社长的最新版Web服务器项目详解 - 05 http连接处理(中)