我编写了一个WebSocket服务器,它只处理作为GET请求的升级请求。如果POST或任何其他类型的请求带有所需的标头,它将由HTTP服务器处理。
在specification中没有明确说明WebSocket升级请求应该是GET请求。
如果升级请求不是GET请求,服务器应该将其作为WebSocket升级请求处理,是否应该将其传递给HTTP服务器处理,还是应该使用状态代码400 Bad Request
来响应?
这可能是设计决策,服务器决定不处理非GET请求的方法吗?
答案 0 :(得分:1)
来自webSocket规范的section 4.1(客户端要求),它说:
请求的方法必须是GET,HTTP版本必须 至少为1.1
然后,在后来的section 4.2.1(阅读客户的开放式握手)webSocket规范中,它说:
客户的开放握手由以下部分组成。如果 服务器在读取握手时发现客户端确实如此 不发送与下面描述相符的握手(注意为 根据[RFC2616],标题字段的顺序并不重要), 包括但不限于任何违反ABNF语法的行为 为握手的组件指定,服务器必须停止 处理客户端的握手并返回一个HTTP响应 适当的错误代码(例如400 Bad Request)。
- HTTP / 1.1或更高版本的GET请求,包括" Request-URI" [RFC2616]应该被解释为/资源名称/ 第3节中定义的(或包含的绝对HTTP / HTTPS URI) /资源名称/).
醇>
因此,有多个地方说http请求必须是GET。
至于你的具体问题:
WebSocket服务器是否只处理GET请求?
是的,webSocket连接始终以GET请求开始,而不是POST或任何其他方法。
如果升级请求不是GET请求,服务器应该将其作为WebSocket升级请求处理,是否应该将其传递给HTTP服务器处理,还是应该使用状态代码400 Bad Request?来响应它? / p>
如上述参考部分所述,服务器应使用400 Bad Request等状态代码进行响应。
这可能是设计决策,服务器决定不处理非GET请求的方法吗?
是