【问题标题】:Responding to a WebSocket upgrade request响应 WebSocket 升级请求
【发布时间】:2018-05-10 05:09:00
【问题描述】:

我有一个从不同客户端获取 WebSocket 升级请求的 WebSocket 服务器。根据请求的查询或路径参数,有时服务器需要拒绝这些升级请求。服务器需要取消握手不是因为它不支持协议或客户端违反协议,而是因为提到的其他原因。

在这种情况下是否有标准状态代码可以响应? specification 似乎没有为此案例定义响应状态代码。 Here 还提到,如果客户端违反协议,则服务器应以“400 Bad Request”响应,但如果服务器只是想取消某些握手,则未提及要发送的响应其他原因。

服务器可以在不违反协议的情况下选择任何状态码的响应吗?

【问题讨论】:

    标签: websocket


    【解决方案1】:

    对于这些 url,允许服务器响应,就好像它对 WebSockets 一无所知。所以一个普通的 400 错误是完全可以的。而且您不需要在正文中显示任何进一步的信息,或添加任何进一步的标题。

    并且在较大的服务器设置中,通常有一个反向代理来接受每个传入的请求,并根据 URL 将此请求转发到相应的应用程序,如果基于 HTTP 的协议要求这样做,那将是一个真正的问题反向代理必须了解所有协议。

    一旦发送了客户端的打开握手,客户端必须 在发送任何进一步的数据之前等待来自服务器的响应。 客户端必须按如下方式验证服务器的响应:

    1. 如果从服务器收到的状态码不是 101,则 客户端根据 HTTP [RFC2616] 程序处理响应。

    400错误描述为:

    6.5.1。 400 错误请求

    400(Bad Request)状态码表示服务器不能或 由于某些被认为是 客户端错误(例如,格式错误的请求语法、无效请求 消息框架或欺骗性请求路由)。

    这也将匹配不支持该协议的 url 的升级请求。

    4xx 错误码定义如下:

    6.5。客户端错误 4xx

    4xx(客户端错误)类状态码表示客户端 似乎犯了错误。除了响应 HEAD 请求时, 服务器应该发送一个包含解释的表示 错误情况,以及它是暂时的还是永久的 健康)状况。这些状态码适用于任何请求方法。 用户代理应该向用户显示任何包含的表示。

    因此,状态为 400 且没有更多信息的响应是有效的,因为这些是可选的。

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2014-06-24
      • 2018-09-22
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      相关资源
      最近更新 更多