WebSocket服务器是否只应处理GET请求?

4
我编写了一个WebSocket服务器,只处理升级请求,这些请求是GET请求。如果有带有所需标头的POST或其他类型的请求,则由HTTP服务器处理。
规范中没有明确说明WebSocket升级请求应该是GET请求。 如果升级请求不是GET请求,服务器应该将其处理为WebSocket升级请求吗?还是将其传递以由HTTP服务器处理?或者应该使用状态码400 Bad Request来响应它?
这可能是一种设计决策,即服务器决定不处理非GET请求的方法吗?
1个回答

8
根据WebSocket规范的第4.1节(客户端要求),要求如下:

请求方法必须为GET,并且HTTP版本必须至少是1.1。

然后在WebSocket规范的第4.2.1节(读取客户端的握手)中,有这样的说明:

客户端的开放式握手包括以下几个部分。如果服务器在读取握手时发现客户端未发送符合以下描述的握手(请注意,根据[RFC2616],标头字段的顺序不重要),包括但不限于任何违反握手组件的ABNF语法规定的情况,服务器必须停止处理客户端的握手并返回一个带有适当错误代码的HTTP响应(例如400 Bad Request)。

  1. 包括“Request-URI” [RFC2616]的HTTP / 1.1或更高版本GET请求,该请求应被解释为第3节中定义的/资源名称/(或包含/资源名称/的绝对HTTP / HTTPS URI)。

因此,有多个地方指出HTTP请求必须是GET。


至于您的具体问题:

WebSocket服务器应仅处理GET请求吗?

是的,WebSocket连接始终以GET请求开始,而不是POST或任何其他方法。

如果升级请求不是GET请求,服务器是否应将其处理为WebSocket升级请求? 它应该传递给HTTP服务器处理还是应该使用状态码进行响应,例如400 Bad Request?

正如规范中上述参考部分所述,服务器应该使用状态码400 Bad Request进行响应。

这是否可以成为一个设计决定,其中服务器决定不处理非GET请求的方法?

是的。


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