文件结构

测试代码
#include <stdio.h>
#include <string.h>
#include <llhttp.h>#define BUFFER_MAXIMUM 0xFFUuint8_t temp[500] = {0};#define DEF_PRINT_FUNCTION(__x) \
int __x(llhttp_t *parser){ \printf("%s\n", __FUNCTION__); \return 0;\
}#define DEF_PRINT_FUNCTION_DATA(__x) \
int __x(llhttp_t *parser, const char *at, size_t length){ \memset(temp, 0, length + 1); \memcpy(temp, at, length); \printf("%s : [%s]\n", __FUNCTION__, temp); \return 0;\
}DEF_PRINT_FUNCTION_DATA(cb_protocol)
DEF_PRINT_FUNCTION_DATA(cb_url)
DEF_PRINT_FUNCTION_DATA(cb_status)
DEF_PRINT_FUNCTION_DATA(cb_method)
DEF_PRINT_FUNCTION_DATA(cb_version)
DEF_PRINT_FUNCTION_DATA(cb_header_field)
DEF_PRINT_FUNCTION_DATA(cb_header_value)
DEF_PRINT_FUNCTION_DATA(cb_chunk_extension_name)
DEF_PRINT_FUNCTION_DATA(cb_chunk_extension_value)
DEF_PRINT_FUNCTION_DATA(cb_body)
DEF_PRINT_FUNCTION(cb_message_begin)
DEF_PRINT_FUNCTION(cb_headers_complete)
DEF_PRINT_FUNCTION(cb_message_complete)
DEF_PRINT_FUNCTION(cb_protocol_complete)
DEF_PRINT_FUNCTION(cb_url_complete)
DEF_PRINT_FUNCTION(cb_status_complete)
DEF_PRINT_FUNCTION(cb_method_complete)
DEF_PRINT_FUNCTION(cb_version_complete)
DEF_PRINT_FUNCTION(cb_header_field_complete)
DEF_PRINT_FUNCTION(cb_header_value_complete)
DEF_PRINT_FUNCTION(cb_chunk_extension_name_complete)
DEF_PRINT_FUNCTION(cb_chunk_extension_value_complete)
DEF_PRINT_FUNCTION(cb_chunk_header)
DEF_PRINT_FUNCTION(cb_chunk_complete)
DEF_PRINT_FUNCTION(cb_reset)int main(int argc, char const *argv[])
{enum llhttp_errno err;llhttp_t parser;llhttp_settings_t settings;llhttp_settings_init(&settings);llhttp_init(&parser, HTTP_REQUEST, &settings);settings.on_protocol = cb_protocol ;settings.on_url = cb_url ;settings.on_status = cb_status ;settings.on_method = cb_method ;settings.on_version = cb_version ;settings.on_header_field = cb_header_field ;settings.on_header_value = cb_header_value ;settings.on_chunk_extension_name = cb_chunk_extension_name ;settings.on_chunk_extension_value = cb_chunk_extension_value ;settings.on_body = cb_body ;settings.on_message_begin = cb_message_begin ;settings.on_headers_complete = cb_headers_complete ;settings.on_message_complete = cb_message_complete ;settings.on_protocol_complete = cb_protocol_complete ;settings.on_url_complete = cb_url_complete ;settings.on_status_complete = cb_status_complete ;settings.on_method_complete = cb_method_complete ;settings.on_version_complete = cb_version_complete ;settings.on_header_field_complete = cb_header_field_complete ;settings.on_header_value_complete = cb_header_value_complete ;settings.on_chunk_extension_name_complete = cb_chunk_extension_name_complete ;settings.on_chunk_extension_value_complete = cb_chunk_extension_value_complete ;settings.on_chunk_header = cb_chunk_header ;settings.on_chunk_complete = cb_chunk_complete ;settings.on_reset = cb_reset ;char request1[900] = \
"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";int request_len1 = strlen(request1);err = llhttp_execute(&parser, request1, request_len1);if (err != HPE_OK) {fprintf(stderr, "出错了:[%s]\n", llhttp_errno_name(err));return 1;}return 0;
}
编译指令
gcc src/llhttp.c src/http.c src/api.c main.c -I ./inc -o excute.exe
输出
PS C:\Users\Administrator\Desktop\LLHTTP> .\excute.exe
cb_message_begin
cb_method : [GET]
cb_method_complete
cb_url : [/example/example.html]
cb_url_complete
cb_protocol : [HTTP]
cb_protocol_complete
cb_version : [1.1]
cb_version_complete
cb_header_field : [Host]
cb_header_field_complete
cb_header_value : [www.baidu.com]
cb_header_value_complete
cb_header_field : [User-Agent]
cb_header_field_complete
cb_header_value : [Mozilla/10.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/000000.1 Firefox/100.0]
cb_header_value_complete
cb_header_field : [Accept]
cb_header_field_complete
cb_header_value : [image/avif,image/webp,*/*]
cb_header_value_complete
cb_header_field : [Accept-Language]
cb_header_field_complete
cb_header_value : [zh-CN,en-US;q=0.7,en;q=0.3]
cb_header_value_complete
cb_header_field : [Accept-Encoding]
cb_header_field_complete
cb_header_value : [gzip, deflate, br]
cb_header_value_complete
cb_header_field : [Referer]
cb_header_field_complete
cb_header_value : [https://www.example.com/]
cb_header_value_complete
cb_header_field : [DNT]
cb_header_field_complete
cb_header_value : [1]
cb_header_value_complete
cb_header_field : [Connection]
cb_header_field_complete
cb_header_value : [keep-alive]
cb_header_value_complete
cb_header_field : [Cookie]
cb_header_field_complete
cb_header_value : [XXXX]
cb_header_value_complete
cb_header_field : [Sec-Fetch-Dest]
cb_header_field_complete
cb_header_value : [image]
cb_header_value_complete
cb_header_field : [Sec-Fetch-Mode]
cb_header_field_complete
cb_header_value : [no-cors]
cb_header_value_complete
cb_header_field : [Sec-Fetch-Site]
cb_header_field_complete
cb_header_value : [same-origin]
cb_header_value_complete
cb_header_field : [Content-Length]
cb_header_field_complete
cb_header_value : [27]
cb_header_value_complete
cb_headers_complete
cb_body : [field1=value1&field2=value2]
cb_message_complete