# llhttp-test **Repository Path**: gentheaven/llhttp-test ## Basic Information - **Project Name**: llhttp-test - **Description**: llhttp lib test - **Primary Language**: Unknown - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-20 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # llhttp http 解析器 [nodejs/llhttp: Port of http_parser to llparse](https://github.com/nodejs/llhttp) 这里用的版本是 9.3.0 ## 简介 运行平台: windows 10 开发工具:VS2019 社区版 开发语言:C 语言 库文件:lib\static\llhttp.lib 头文件:llhttp.h 测试程序:llhttp-test.exe 功能:http 解析器 ------ ## 编译本项目 VS2019 打开根目录下的项目文件:llhttp.sln 编译选项: release, x64 先编译库:llhttp-static,编译生成 lib\static\llhttp.lib 再编译测试程序: llhttp-test.exe ## 使用llhttp库 只需要一个头文件:**llhttp.h** 一个**静态链接库**:lib\static\llhttp.lib ,大小 547KB 接口: ``` on_message_begin: 当新的请求/响应开始时调用 on_message_complete: 当请求/响应已完全解析时调用 on_url_complete: 当URL解析完成后调用 on_method_complete: 当HTTP方法解析完成后调用 on_protocol_complete: 当HTTP版本解析完成后调用 on_version_complete: 当HTTP版本解析完成后调用 on_status_complete: 当状态码解析完成后调用 on_header_field_complete: 当头部名称解析完成后调用 on_header_value_complete: 当头部值解析完成后调用。 on_chunk_header: 当新的数据块开始时调用。当前数据块长度存储在.parser->content_length中 on_chunk_extension_name_complete: 当数据块扩展名称开始时调用 on_chunk_extension_value_complete: 当数据块扩展值开始时调用 on_chunk_complete: 当接收到新的数据块时调用 on_reset: 当在同一个解析器上接收到新消息之前和之后调用。对于解析器的第一条消息不调用此函数 on_url: 当接收到URL的另一个字符时调用 on_status: 当接收到状态码的另一个字符时调用 on_method: 当接收到方法的另一个字符时调用 on_protocol: 当接收到协议的另一个字符时调用 on_version: 当接收到版本的另一个字符时调用 on_header_field: 当接收到头部名称的另一个字符时调用 on_header_value: 当接收到头部值的另一个字符时调用 on_chunk_extension_name: 当接收到数据块扩展名称的另一个字符时调用 on_chunk_extension_value: 当接收到扩展值的另一个字符时调用 on_headers_complete:头部解析阶段结束时调用 ``` ## 测试 测试如下3个http 头: ``` const char* request = \ "GET /example/example.html HTTP/1.1\r\n\ Host: www.baidu.com\r\n\ User-Agent: Mozilla/10.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/000000.1 Firefox/100.0\r\n\ Accept: image/avif,image/webp,*/*\r\n\ Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3\r\n\ Accept-Encoding: gzip, deflate, br\r\n\ Referer: https://www.example.com/\r\n\ DNT: 1\r\n\ Connection: keep-alive\r\n\ Cookie: XXXX\r\n\ Sec-Fetch-Dest: image\r\n\ Sec-Fetch-Mode: no-cors\r\n\ Sec-Fetch-Site: same-origin\r\n\ Content-Length: 27\r\n\r\n\ field1=value1&field2=value2\r\n"; const char* req_a = "CONNECT ntp.msn.cn:443 HTTP/1.1\r\n\ Host: ntp.msn.cn : 443\r\n\ Proxy-Connection"; const char* req_b = ": keep-alive\r\n\ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0"; ``` 运行结果如下: ``` 开始解析第1段 请求的地址是: [/example/example.html] 头字段:[Host], 字段值:[www.baidu.com] 头字段:[User-Agent], 字段值:[Mozilla/10.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/000000.1 Firefox/100.0] 头字段:[Accept], 字段值:[image/avif,image/webp,*/*] 头字段:[Accept-Language], 字段值:[zh-CN,en-US;q=0.7,en;q=0.3] 头字段:[Accept-Encoding], 字段值:[gzip, deflate, br] 头字段:[Referer], 字段值:[https://www.example.com/] 头字段:[DNT], 字段值:[1] 头字段:[Connection], 字段值:[keep-alive] 头字段:[Cookie], 字段值:[XXXX] 头字段:[Sec-Fetch-Dest], 字段值:[image] 头字段:[Sec-Fetch-Mode], 字段值:[no-cors] 头字段:[Sec-Fetch-Site], 字段值:[same-origin] 头字段:[Content-Length], 字段值:[27] 头部解析完成,状态转移到下一个阶段 请求携带的数据: [field1=value1&field2=value2] 解析完成,状态转移到下一个阶段 开始解析第2段 请求的地址是: [ntp.msn.cn:443] 头字段:[Host], 字段值:[ntp.msn.cn : 443] 头字段:[Proxy-Connection], 开始解析第3段 字段值:[keep-alive] 头字段:[User-Agent], 字段值:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0] ``` 测试结果:满意 初始化之后,只需要不断的喂给解析器http 包,它会自动解析其内容。 如果http 包不完整,它会等待下一个http 包。 llhttp_execute(&parser, http_string, http_string_len); ## 编译llhttp 编译器:Visual studio 2019 社区版 操作系统:win10 编译步骤: ### 1 - 安装 nodejs [nodejs.org/zh-cn/download/](https://nodejs.org/zh-cn/download/) 比如我下载的是:node-v22.19.0-x64.msi: 文件大约有 30MB 安装之后,在命令行终端输入:用来验证是否安装正确,并加入到系统变量中。 ``` node -v v22.19.0 npm -v 11.6.0 npx -v 11.6.0 ``` **`npm`**:是一个**包管理器**。它的核心工作是**安装**和**管理**依赖。 **`npx`**:是一个**包执行器**。它的核心工作是**运行**包。它专注于如何更方便地执行包提供的命令。 ### 2 - 生成文件 这里用 npx 生成编译需要的文件。 下载 llhttp 的源代码,这里我们下载版本 9.3.0 解压,在源代码的根目录下,执行: ``` npx ts-node bin/generate.ts ``` 执行命令后,会在 \build 目录下生成2个文件:llhttp.h 和 llhttp.c build\llhttp.h build \c\llhttp.c 加上源代码目录下原有的2个文件: src\native: api.c http.c 这4个文件,最终会被 VS2019 编译成 llhttp.lib 如何知道运行 npx 命令生成 llhttp.h 和 llhttp.c 因为源代码的Makefile 文件中,有一句话: ``` generate: npx ts-node bin/generate.ts ``` ### 3 - 生成静态链接库 把上述的4个文件,分别拷贝到 VS 项目中的 src目录,include 目录, 就可以用 VS2019 编译了。 ### 4 - npx 编译错误 运行 npx ts-node bin/generate.ts 发生错误, ``` Cannot find module 'fs' or its corresponding type declarations ``` 手动安装 @types/node 声明文件 npm install @types/node --save-dev 再编译,就能编译通过了。 ------