🔗 功能:HTTP/1.1 支持
- 目标:符合 HTTP/1.1 RFC 标准
- 状态:90% 符合且仍在改进中。
- 版本: 3.2
-
更多:
- RFC 7230 HTTP/1.1:消息语法和路由
- RFC 2817 在 HTTP/1.1 内升级到 TLS
- RFC 7231 HTTP/1.1:语义和内容
- RFC 7238 状态码 308 (永久重定向)
- RFC 7232 HTTP/1.1:条件请求
- RFC 7233 HTTP/1.1:范围请求
- RFC 7234 HTTP/1.1:缓存
- RFC 7235 HTTP/1.1:认证
- RFC 2617 基本和摘要访问认证
- RFC 4559 基于 SPNEGO 的 Kerberos 和 NTLM HTTP 认证
🔗 摘要
Squid-3.2 声称支持 HTTP/1.1。Squid v3.1 声称支持 HTTP/1.1,但仅限于发送请求(从 Squid 到服务器)。
早期的 Squid 版本默认不声明支持 HTTP/1.1,因为它们无法完全处理 Expect:100-continue、1xx 响应和/或分块消息。
Co-Advisor 测试不再检测到 Squid 主干中与缓存无关的要求方面的 RFC MUST 级别违规。许多与缓存相关 Requirements 仍然被违反。“项目头部的合规性百分比”本质上是一个营销噱头(即,无意义或误导但技术上正确的信息)。我们正在积极努力修复 Co-Advisor 检测到的所有已知违规项。
🔗 清单
截至 2018 年 8 月,Squid v4+ 符合 RFC MUST 级要求:HTTP-1.1-Checklist_2018-08-09.ods。
2013 年 8 月收集的 Squid v3 和 v2 结果:HTTP-1.1-Checklist_2013-08-21.ods。
链接的文档包含多个 Squid 版本自动 Co-Advisor HTTP/1.1 合规性测试结果。每个测试包含近 900 个单独的测试用例,针对 RFC 2616 和 7230-7235 中的各种 MUST 要求。每个 Squid v3+ 列汇总了多项测试的结果。从 HTTP 角度来看,这些测试是相同的。如果在这些测试期间某个测试用例显示了不同的结果,则无法确定确切的测试用例结果。此类结果用字母 ‘U’ 标记。所有其他标记都对应于稳定的结果。一些测试用例由于 Squid 缺乏 HTTP/1.1 功能支持、与测试套件不兼容、测试套件错误或其他原因而失败。此类测试用例用问号标记。其余的测试用例结果是成功和违规。只有成功的结果计入“测试用例通过”百分比。
这些测试是在未经任何特殊修改的原版 Squid 上进行的。2.7 的测试似乎是在启用了可配置的 HTTP/1.1 服务器广告的情况下进行的。
🔗 合规性
以下合规性说明适用于 Squid-3.2 及更高版本。旧版 Squid 甚至没有有条件地遵守 HTTP/1.1。
🔗 消息语法和路由
规范文档:RFC 7230
- HTTP/1.1 要求我们将版本升级到我们支持的最高版本。这在与某些损坏的客户端和服务器交互时被发现存在问题。
- NP:ICY 协议似乎是主要问题。因此,已原生实现 ICY 支持以解决此问题。
- NP:Sharepoint 和其他几个 MS 产品在服务器和客户端之间广告不同的 HTTP/1.x 版本时(如 Squid-3.1 所见)会出现身份验证循环错误。这已通过 Squid-3.2 在服务器和客户端两端都广告 HTTP/1.1 来解决。
- HTTP/1.1 要求在解析器和组合器中都支持分块编码。这适用于响应和请求。
- Squid-3 和 Squid-2 都至少包含响应分块解码。从 Squid-3.2 开始,除 CONNECT 请求外,所有流量都提供分块编码功能。
- Squid 缺少对分块编码尾部的支持。
- Squid 缺少对 deflate 和 gzip 传输编码的支持。
- Squid 缺少对 HTTP 消息尾部的支持。
规范文档:RFC 2817
- Squid 有条件地符合此功能。始终忽略标头内容,并确保 **Upgrade** 标头被安全丢弃。
- 启用 ssl-bump 功能的 Squid 将尝试升级 CONNECT 请求到 TLS,无论 Upgrade 标头是否存在。
🔗 语义和内容
规范文档:RFC 7231
- 需要清理转发路径,以更好地分离 HTTP 消息和实际内容,从而允许正确转发 1xx 响应。1xx 转发已在 Squid-3.2 中实现,但转发路径仍需进一步完善以提高效率。
- 这很可能会触及 store API,因为今天所有消息即使只是中间的 1xx 响应,都会通过 store。
规范文档:RFC 7238
- Squid 完全符合此规范。
🔗 条件请求
规范文档:RFC 7232
- Squid 缺少对 **If-Unmodified-Since** 验证的支持。
- 重新验证请求中缺少 **If-None-Match** 标头创建
🔗 范围请求
规范文档:RFC 7233
- Squid 无法存储范围请求,目前仅限于将请求转换为完整请求或不经修改地将其传递给后端服务器。
- 我们需要实现存储以允许部分范围存储。
- 现有的范围处理中还存在一些错误需要解决。
🔗 缓存
规范文档:RFC 7234
- 许多与缓存相关的要求仍然被违反。请参阅 Co-Advisor 清单。
🔗 认证
规范文档:RFC 7235
规范文档:RFC 2617
- Squid 完全支持 Basic 认证。
- 摘要认证的最低行为存在未解决的错误。
- Squid 缺少对 Digest auth-int 认证模式的支持。
规范文档:RFC 4559
- Squid 完全支持 Negotiate/Kerberos 认证。
- Squid 将另外生成 **Connection:Proxy-Support** 标头以在链式使用时强制执行语义。- Squid 另外支持 Proxy-Auth 的 Negotiate。
- NTLM 和 Negotiate/NTLM 实现存在未解决的错误。