引言:为什么要手写 HTTP 协议解析器?
- 了解 Node.js 的 http 模块封装的细节
- 通过手写客户端解析器深入理解 HTTP 报文结构(状态行、响应头、响应体等)
- 学习 chunked 传输编码的原理(Transfer-Encoding: chunked)
最终目标
实现这样一段功能
1 | const response = await request.send(); |
更进一步,我们还希望支持解析成结构化 JSON:
1 | { |
实现步骤
1. 创建服务端
1 | // server.js |
2. 创建一个客户端
1 | // client.js |
3. 构造基础的HTTP
net模块相关内容 参考
这里我们不关心内容, 直接返回结果
1 |
|
console.log(response, ‘response’) 此时会返回 Received data: name=zhangfan
接下来我们开始构造 ResponseParser 来处理返回的数据
4. ResponseParser
1 |
|
使用
1 | // reqeuest.js |
这是一个最简单的 ResponseParser 仅仅能用来处理 application/x-www-form-urlencoded 格式的数据,而且未做异常处理
body 返回也不是我们所需要的
由于HTTP/1.1 中允许服务端分块传输响应体,每个块以十六进制数字表示长度,后面跟该长度的数据块,再跟一个空行,最后一个块长度为 0 表示结束
这里 e 是十六进制的14,表示后面有14字节数据。
接下来我们来拆分头部和data的处理, 编写拆分函数
ChunkedBodyParser
我们需要处理 Transfer-Encoding: chunked 这种响应体
1 |
|
HeaderParser
1 |
|
使用
1 |
|
总结
通过逐步构建一个简单的 HTTP 响应解析器,实现了以下目标
- 使用状态机处理响应头与 Chunked Body
- 理解 HTTP 响应数据结构
- 支持结构化输出,模拟真实服务返回格式