一、http-parser简介
1、简介
http-parser是一个用C编写的HTTP消息解析器,可以解析请求和响应,被设计用于高性能HTTP应用程序。它不会进行任何系统调用及内存分配,它不会缓冲数据,它可以被随时中断。根据你的体系结构,每个消息流只需要大约40个字节的数据(在每个连接的web服务器中。
2、特征
- 不依赖第三方库
- 处理持续流
- 分块解码
- 支持Upgrade
- 防止缓冲区溢出攻击
3、可以从HTTP消息中解析下列信息
- 报头域及值(Header fields and values)
- 内容长度(Content-Length)
- 请求方法
- 响应状态码
- 传输编码
- HTTP版本
- 请求URL(网址)
- 消息体(Message body)
二、用法
1、下载
http-parser官方地址:https://github.com/nodejs/http-parser
解压:
unzip http-parser-master.zip
2、编译安装
make
make parsertrace
make url_parser
sudo make install
3、初始化
http-parser的每个tcp连接使用一个对象。使用初始化结构http_parser_init()并设置回调。初始化结构如下:
void http_parser_settings_init(http_parser_settings *settings);
对于请求解析器可能是这样的:
http_parser_settings settings;
settings.on_url = my_url_callback;
settings.on_header_field = my_header_field_callback;
/* ... */
http_parser *parser = malloc(sizeof(http_parser));
http_parser_init(parser, HTTP_REQUEST);
parser->data = my_socket;
4、执行并错误检查
当套接字接收到数据时,执行解析器并检查错误。执行器函数如下
size_t http_parser_execute(http_parser *parser,
const http_parser_settings *settings,
const char *data,
size_t len);
例:
size_t len = 80*1024, nparsed;
char buf[len];
ssize_t recved;
recved = recv(fd, buf, len, 0);
if (recved < 0) {
/* Handle error. */
}
/* Start up / continue the parser.
* Note we pass recved==0 to signal that EOF has been received.
*/
nparsed = htt