Web服务器踩坑之旅03:解析HTTP请求报文

本文详述了HTTP协议中的请求报文结构,包括URL、URI的概念,以及GET请求的解析过程。通过实例展示了HTTP请求行、请求头部和请求数据的组成。文章还介绍了使用状态机来解析HTTP请求的方法,特别指出在Web服务器中如何处理和解析请求行内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目地址:

本文实现的文件在源码中的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连接处理(中)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值