这些值并不是同一种模式的两种竞争写法:

Connection: Upgrade
Connection: keep-alive, Upgrade

第二个值列出了两个连接选项。HTTP 把 Connection 定义为逗号分隔的列表,选项名不区分大小写。把整个值与精确字符串 Upgrade 比较的代码,会漏掉包含该选项的合法列表。

在普通转发中,HTTP 中间人会解析传入字段,删除由其选项点名的字段,然后删除 Connection 本身,或将其替换为中间人为下一段连接准备的控制选项。

只删除硬编码的 Keep-Alive 字段并不够。消息可以在列表中点名另一个连接特有的字段,而该字段绝不能泄漏进普通转发。

支持协议升级需要有意处理两条连接和新协议。盲目复制传入的 Upgrade 头并不是这种交接的实现。

当一个浏览器正常而另一个失败时,比较中间人两侧的实际字段值。单个令牌与双令牌列表之间的差异可以暴露解析器错误,而无需让浏览器模仿另一个浏览器的精确格式。

这涉及代理所解析的 HTTP 消息。普通的 HTTPS CONNECT 隧道不会把加密网站的 Connection 字段暴露给该代理。

相关文章