Node.js 的 CONNECT 处理器必须保留 head 缓冲区
在 HTTP 到隧道的边界处理 Node 的 CONNECT 套接字与 head 缓冲区,保留已越过请求头读取的字节。
Node HTTP 服务器通过请求回调处理普通代理请求。CONNECT 走另一条路径:服务器随请求、客户端套接字和 head 缓冲区一起触发 connect 事件。
该事件是 HTTP 解析与隧道之间的交接点。没有可继续用于隧道流量的普通 ServerResponse 对象。
| 参数 | 它承载什么 |
|---|---|
req | CONNECT 请求,包括目标权威与请求头 |
clientSocket | 返回客户端的连接 |
head | Node 已越过 HTTP 请求头读取的隧道数据,可能为空 |
在转发字节之前完成 HTTP 决策
校验请求的主机与端口,应用代理的访问与认证策略,并建立上游连接。CONNECT 标识形如 service.example:443 的权威;解析该形式时要考虑 IPv6 权威,而不是在每个冒号处盲目切分。
隧道被接受后,发送成功的 HTTP 响应及其终止空行。然后先把任何 head 字节转发到上游,再继续处理来自客户端套接字的后续字节。附加新的数据监听器无法找回已单独交给处理器的缓冲区。
Node 官方的隧道示例在连接两个流方向之前,用 serverSocket.write(head) 完成这次交接。它的小示例说明了这一过渡;实际部署的代理还需要有界的连接尝试、访问控制与生命周期管理。
成功后,字节属于服务协议
成功的 CONNECT 响应会把连接变成字节流。若目标是 HTTPS 站点,其 TLS 交换在该流内部进行。仅仅建立隧道并不要求代理签发替代的网站证书。
在接受 CONNECT 之前,可以用 HTTP 错误说明拒绝原因。接受之后再向流中写入 HTTP 500 会把字节注入隧道协议。后续失败时应改为结束或销毁相应的连接。
用 具备背压感知的流处理 连接两个方向,并决定 end、error 和 close 事件如何终止对端。要把最初的 head 缓冲区保留在同一套所有权模型中;它是应用数据,而不是可以丢弃的多余 HTTP 请求头。