手写http协议解析库
这篇文章介绍了一个手写 HTTP 协议解析库的设计思路,包括报文结构、状态机和使用方式。协议结构建模先从 HTTP 请求与响应报文的标准组成入手。通过结构图明确各字段在解析中的位置与作用。为后续状态机拆分提供输入基础。状态机解析策略分别设计请求报文与响应报文的解析状态机。通过状态迁移控制解析顺序和异常分支。这种方式有利…
手写http协议解析库http协议的组成 http请求报文如下: image.png image.png http响应报文如下: image.png image.png状态机设计 请求报文解析 image.png 响应报文解析 image.png代码结构设计基础结构类:Response和Request,其中都包含一个Url类,用于解析得到路径和Query参数。工具类:HttpParser,HttpParser用于解析纯http报文然后得到对应的Response或Request,组合成字符串信息只需要调用Request或者Response对应的to_string()方法。 http__Parser.png代码使用示例 对于head和body的设置均可通过直接调用head()和body()方法来设置,这个方法返回的是一个左值。#include"http-parser/Parser.h" int main(){ http::Parser parser; auto req = parser.ToRequest(buffer); std::cout << req.to_string(); //根据request内容获取对应的http报文 req.head()["dfasf"] = "fda"; //随意设置request的header req.body() = "fdsafsadf"; //设置request的body部分 //request的特殊字段(GET的FORM和POST的form auto v = req.Query("test"); //获取第一个值 auto v1 = req.PostQuery("test"); //获取post表单里的第一个query值 req.PostMultiPart("test"); //返回form-data的键值(可以传入文件 http::Response response; response.SetStatus(http::OK); response.SetContentType(http::ACCEPT_CONTENT_TYPE::T_JSON); response.SetConnection(false); response.body() = R"({"hello world!":2323})"; auto response_text = response.to_string(); }
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行