响应WebSocket升级请求

5
我有一个WebSocket服务器,可以接收来自不同客户端的WebSocket升级请求。根据请求的查询或路径参数,有时服务器需要拒绝这些升级请求。服务器需要取消握手,不是因为它不支持协议或客户端违反了协议,而是因为其他原因如上所述。
在这种情况下,是否有标准状态码来响应?规范似乎没有定义此案例的响应状态码。这里也提到,如果是客户端的协议违规,服务器应该响应“400 Bad Request”,但没有提到如果服务器仅想因某些其他原因取消握手应发送的响应。
服务器可以选择任何状态码作出回应,而不违反协议吗?
1个回答

4
对于那些 URL,服务器允许像不知道 WebSockets 一样响应。所以,一个简单的 400 错误就可以了。你不需要在正文中显示任何进一步的信息,或添加任何其他头部信息。
在较大的服务器设置中,通常有一个反向代理,它接受每个传入的请求,并根据 URL 将这些请求转发到对应的应用程序。如果基于 HTTP 的协议要求此反向代理必须了解所有协议,则这将是一个真正的问题。
一旦客户端发送了开放握手,客户端必须等待服务器的响应才能发送任何进一步的数据。客户端必须按照以下方式验证服务器的响应:
- 如果从服务器收到的状态代码不是 101,则客户端按照 HTTP [RFC2616] 程序处理响应。
400 错误的定义如下:
400 Bad Request
400 (Bad Request) 状态码表示由于被视为客户端错误(例如,格式错误的请求语法、无效的请求消息框架或欺骗性的请求路由)而导致服务器无法或者不会处理请求。
这也适用于不支持该协议的 URL 的升级请求。
4xx 错误代码的定义如下:
6.5. 客户端错误 4xx
4xx(客户端错误)状态代码系列表示客户端似乎犯了错误。除非响应头中通过 HEAD 请求,否则服务器应该发送包含错误情况的说明以及它是否是临时或永久条件的表示。这些状态代码适用于任何请求方法。用户代理应显示任何包含的表示给用户。
因此,一个带有 400 状态和没有进一步信息的响应是有效的,因为那些是可选的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接