在转发客户端数据流之前完成 CONNECT 头部的解析
仅在请求行之后就开始转发的代理服务器,可能会把自己的 Host 头发往目标站点的 TLS 端口。
在 CONNECT 请求行之后,这些字节仍然属于代理:
CONNECT service.example:443 HTTP/1.1\r\n
Host: service.example:443\r\n
User-Agent: example-client\r\n
\r\n把 Host 或 User-Agent 转发到 443 端口,会在目标期待 TLS 的地方送去明文头部。这种失败可能在任何加密算法选择发挥作用之前就发生。
- 在建立连接的超时和头部大小限制之内,读取并解析到空行头部结束符。
- 应用代理认证和目标策略。
- 建立获准的目标连接。
- 发送成功的 CONNECT 响应并进入隧道模式。
保留边界之后的缓冲字节,供相应的下一状态使用。不要丢弃它们,也不要把代理的请求头当成网站后续的请求。
客户端在响应侧负有对等的义务:在开始隧道协议之前读完成功的 CONNECT 响应。两端必须就数据流切换角色的边界达成一致。