0
点赞
收藏
分享

微信扫一扫

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

朱悟能_9ad4 2022-03-11 阅读 67

项目地址:

本文实现的文件在源码中的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
 空行
 请求数据为空

解析请求报文

在此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连接处理(中)

举报

相关推荐

0 条评论