【问题标题】:Is HTTP status code 426 Upgrade Required only meant signal an upgrade to a secure channel is required?HTTP 状态代码 426 需要升级是否仅表示需要升级到安全通道的信号?
【发布时间】:2013-07-26 05:00:51
【问题描述】:

我的移动设备通过 HTTPS 与服务器上的 RESTful API 进行通信。其中一项操作是数据同步,用于将离线时所做的修改推送到服务器,并下拉服务器上并行进行的更新。

我遇到了一个边缘情况,即同步操作可能会在现有客户端中静默失败。我已经升级了客户端上的“同步协议”以正确处理这种情况。理想情况下,我希望所有老客户在尝试同步时都会收到一条消息,告诉他们升级。

通信仅在我的服务器和我的移动客户端之间进行,因此我意识到我可以返回任意数量的 HTTP 代码并向客户端发出信号,以在未来显示一条消息,建议用户升级并立即停止同步过程。

这是否会被视为对 HTTP 426 Upgrade Required 返回码的意图的混蛋,以使用它来表示这一点。我能找到的每一个参考资料(IETF RFC 2817、Wikipedia)都谈到了使用它来向客户端发出升级到 TLS 的信号。它是否意味着仅限于定义良好的/安全协议,如 SSL 和 TLS,还是 HTTP 层的通用升级标志,传统上仅用于 SSL 和 TLS?

如果它不适用于此用例,那么 HTTP 303 See Other 会被认为更合适,还是我缺少其他代码?

【问题讨论】:

  • RFC 2616 说你必须告诉客户要“升级”到什么。如果你能适应你的用例,它可能不是混蛋。 ;)

标签: http rest ssl


【解决方案1】:

引用我的previous answers之一:

HTTP Upgrade 用于表示偏好或要求 切换到不同版本的 HTTP 或其他协议,如果 可能:

The Upgrade general-header allows the client to specify what 
additional communication protocols it supports and would like to use 
if the server finds it appropriate to switch protocols. The server 
MUST use the Upgrade header field within a 101 (Switching Protocols) 
response to indicate which protocol(s) are being switched.

      Upgrade        = "Upgrade" ":" 1#product

  For example,

     Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

The Upgrade header field is intended to provide a simple mechanism 
for transition from HTTP/1.1 to some other, incompatible protocol.

根据IANA register,只有3个注册 提到它(包括 HTTP 规范本身中的一个)。

另外两个用于:

(从那时起,IANA 注册没有改变。)

RFC 2817 中定义的 426 响应代码显然与 RFC 2816 中定义的“HTTP 升级”意义上的升级有关。这是层上当前协议的更改当前使用(即 HTTP 本身)。 (甚至根本不是从http:// 升级到https://。)

在 HTTP 之上交换的消息(如果是协议的一部分)不属于该协议的一部分。就 HTTP 而言,它们只是超媒体实体。

如果您更改超媒体的含义,我认为 426 不适合。普通的 400 可能是更好的选择。请注意,带有错误状态代码(4xx、5xx)的响应不会阻止您在响应中关联实体:这是告诉客户端升级您的协议(在该级别)的消息应该位于的位置。

【讨论】:

    【解决方案2】:

    我同意 Bruno 的观点,即 426 不是最佳选择。 400 更好,但我认为403 更好。

    10.4.4 403 禁止

    服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态码 404(未找到)。

    Twitter API 有此先例。

    自 2014 年 2 月 26 日起,api.twitter.com 为所有非 SSL 传入流量返回 403 状态代码。您的客户端代码应该能够处理此错误。

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 2019-07-29
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多