我们实现了 muduo 服务器框架之后,就可以被很多应用层协议包装起来使用,下面我们就以最常见的 HTTP 协议为例,搭建一个 HTTP 服务器!
HTTP协议模块用于对高并发服务器模块进行协议支持,基于提供的协议支持能够更方便的完成指定协议服务器的搭建。而 HTTP 协议支持模块的实现,可以细分为以下几个模块。
1、Util工具模块
这个模块的功能就是提供一些服务器需要的功能性工具接口,方便使用者直接调用!大概需要提供以下这些接口:
- 读取文件内容
- 向文件写入内容
URL编码URL解码- 通过
HTTP状态码获取描述信息 - 根据文件后缀名获取
mime(即想要请求的文件格式) - 判断一个文件是否是目录
- 判断一个文件是否是一个普通文件
- 判断一个
HTTP资源路径是否有效
2、HttpRequest请求模块
这个模块是 HTTP 请求数据模块,用于存储 HTTP 的请求信息,然后按照 HTTP 请求格式进行解析,得到各个关键要素放到 Request 中,这样子能让 HTTP 请求的分析更加的方便!
要分析的内容无非就是请求信息,如下所示:
- 请求方法
URL:- 资源路径
- 查询字符串
- 协议版本
- 头部字段
- 正文
所以需要提供以下接口:
- 头部字段的插入和获取
- 查询字符串的插入和获取
- 长连接和短连接的判断
- 正文长度的获取
3、HttpResponse响应模块
这个模块和上面的请求模块就是相反的,主要存储 HTTP 的响应信息,在进行业务处理的同时,让使用者向 Response 中填充响应要素,完毕后将其组织成为 HTTP 响应格式的数据,发送给客户端,这样子能让 HTTP 响应的过程操作变得简单!
要操作的内容无非就是响应信息,如下所示:
- 协议版本
- 响应状态码
- 状态码描述信息
- 头部字段
- 正文
所以需要提供以下接口:
- 头部字段的插入和获取
- 长连接和短连接的设置与判断
- 正文的设置
4、HttpContext上下文模块
这个模块用于记录 HTTP 请求的接收和处理进度,因为有可能出现一种情况,就是接收的数据并不是一条完整的 HTTP 请求数据,也就是请求的处理需要在多次收到数据后才能处理完成,所以在每次处理的时候,就需要将处理进度记录起来,以便于下次从当前进度继续向下处理,最终得到一个完整 HttpRequest 请求信息对象,因此在请求数据的接收以及解析部分需要一个上下文来进行控制接收和处理节奏。
这个模块要关心的要素如下所示:
- 已经接收并处理的请求信息
- 接收状态(即处于何种阶段):
- 接收请求行(当前处于接收并处理请求行的阶段)
- 接收请求头部(表示请求头部的接收还没有完毕)
- 接收正文(表示还有正文没有接收完毕)
- 接收数据完毕(这是一个接收完毕,可以对请求进行处理的阶段)
- 接收处理请求出错
- 响应状态码:
- 在请求的接收并处理中,有可能会出现各种不同的问题,比如解析出错、访问的资源不对、没有权限等等,而这些错误的响应状态码都是不一样的。
所以需要提供以下接口:
- 接收并处理请求数据:
- 接收请求行
- 解析请求行
- 接收头部
- 解析头部
- 接收正文
- 返回解析完毕的请求信息
- 返回响应状态码
- 返回接收解析状态
5、HttpServer服务器模块
这个模块是最终给组件使用者提供的 HTTP 服务器模块了,用于以简单的接口实现 HTTP 服务器的搭建。
HttpServer 模块内部如下元素:
- 一个
TcpServer对象:实现服务器的搭建。 - 两个提供给
TcpServer对象的接口:连接建立成功设置上下文接口,数据处理接口。 - 一个哈希表存储请求与处理函数的映射表:组件使用者向
HttpServer设置哪些请求应该使用哪些函数进行处理,等TcpServer收到对应的请求就会使用对应的函数进行处理。