我有一个WebSocket服务器,可以从不同的客户端获取WebSocket升级请求。根据请求的查询或路径参数,有时服务器需要拒绝这些升级请求。服务器需要取消握手,不是因为它不支持协议,或者是因为客户端违反协议,而是因为上述其他原因。
在这种情况下是否有要响应的标准状态代码? specification似乎没有为此案例定义响应状态代码。 Here还提到如果客户端违反协议,服务器应该响应“400错误请求”,但如果服务器只想取消握手,则不会提及要发送的响应出于其他原因。
服务器是否可以选择带有任何状态代码的响应而不违反协议?
答案 0 :(得分:2)
对于那些URL,允许服务器响应,就好像它对WebSockets一无所知。所以一个简单的400错误是完全正常的。并且您不需要在正文中显示任何进一步的信息,或者添加任何其他标题。
在较大的服务器设置中,通常有一个反向代理接受每个传入请求,并根据URL将此请求转发到相应的应用程序,如果基于HTTP的协议需要这个,这将是一个真正的问题反向代理必须知道所有协议。
一旦发送了客户端的开放握手,客户端就必须 在发送任何进一步的数据之前等待服务器的响应。 客户端必须按如下方式验证服务器的响应:
- 如果从服务器收到的状态代码不是101,则 客户端处理每个HTTP [RFC2616]过程的响应。
醇>
400错误描述为:
6.5.1。 400错误请求
400(错误请求)状态代码表示服务器不能或 由于被认为是某种东西,它不会处理请求 客户端错误(例如,格式错误的请求语法,无效请求 消息框架或欺骗性请求路由)。
这也会匹配不支持该协议的网址的升级请求。
4xx错误代码定义如下:
6.5。客户端错误4xx
4xx(Client Error)类状态代码表示客户端 似乎有错误。除了响应HEAD请求时, 服务器应该发送一个包含对的解释的表示 错误情况,无论是暂时的还是永久的 条件。这些状态代码适用于任何请求方法。 用户代理应该向用户显示任何包含的表示。
因此,具有400状态且没有其他信息的响应是有效的,因为这些是可选的。