起首进入 Parser 的静态 Execute() 函数,我们看到它把传进来的 Buffer 转化为 C++ 下的 char* 指针,并记录其数据长度,同时去履行当前调用的 parser 对象所对应的 Execute() 函数。
在这个 Execute() 函数中,有个最重要的代码,就是:
- size_t nparsed =
- http_parser_execute(&parser_, &settings, data, len);
这段代码是调用真正解析 HTTP 数据包的函数,它是 Node.js 这个项目标一个自研依附,叫 http-parser。它自力的项目地址在 https://github.com/nodejs/http-parser,我们本文顶用的是 Node.js v8.9.2 中所依附的源码,应当会有误差。
http-parser
能看出来 parsers 是 HTTPParser 的一条 Free List(效不雅类似于最简略单纯的动态内存池),每个 Parser 在初始化的时刻绑定上了各类回调函数。具体的一些回调函数就不细匠了棘有兴趣的童鞋可自行翻阅。
HTTP Request 数据包体
如不雅你已经对 HTTP 包体懂得了,可以略过这一节。
办法 URI HTTP/版本
头1: 我是头1
头2: 我是头2
简单起见,这里就写出最基本的一些内容,至于 Body 什么的大年夜家本身找材料看吧。
总而言之,我们接下去要看的就是 src/node_http_parser.cc 了。
膳绫擎的是什么意思呢?我们看看 CURL 的结不雅就知道了,实际上对应 curl ... -v 的中心输出:
- GET /test HTTP/1.1
- Host: 127.0.0.1:5555
- User-Agent: curl/7.54.0
- Accept: */*
而——重点来了,导致我们本文所述“Bug”出现的请求,它的请求包如下:
- GET /foo bar HTTP/1.1
- Host: 127.0.0.1:5555
- User-Agent: curl/7.54.0
- Accept: */*
重点在第一行:
- GET /foo bar HTTP/1.1
源码解析
话不若干,我们之间前去 http-parser 的 http_parser.c 看 http_parser_execute () 函数中的状况机变更。
那么扫描到每个字符的时刻,都有属于当前的一个状况,如“正在扫描处理 uri”、“正在扫描处理 HTTP 协定并且处理到了 H”、“正在扫描处理 HTTP 协定并且处理到了 HT”、“正在扫描处理 HTTP 协定并且处理到了 HTT”、“正在扫描处理 HTTP 协定并且处理到了 HTTP”、……
憋笑,这是真的,我们看看代码就知道了:
- case s_req_server:
- case s_req_server_with_at:
- case s_req_path:
- case s_req_query_string_start:
- case s_req_query_string:
- case s_req_fragment_start:
- case s_req_fragment:
- {
- switch (ch) {
- case ' ':
- UPDATE_STATE(s_req_http_start);
- CALLBACK_DATA(url);
- break;
- case CR:
- case LF:
- parser->http_major = 0;
- parser->http_minor = 9;
- UPDATE_STATE((ch == CR) ?
- s_req_line_almost_done :
- s_header_field_start);
推荐阅读
黑客在渗入渗出一个网站时,受制于本身的黑客才能以及小我思维宽度,在想尽了一切办法后,却一无所得,最终就不得不走上了暴力破解这一条陆辜暴力破解的道理就是穷举法,其根本思惟是根据标题标部分前提>>>详细阅读
本文标题:Node.js中遇到含空格URL的神奇“Bug”——小范围深入HTTP协议
地址:http://www.17bianji.com/lsqh/39781.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示