我编写了一个 WebSocket 服务器,它只处理 GET 请求的升级请求。如果带有所需标头的 POST 或任何其他类型的请求到来,它将由 HTTP 服务器处理。
规范中没有明确说明 WebSocket 升级请求应该 是 GET 请求。如果升级请求不是 GET 请求,服务器是否应该将其作为 WebSocket 升级请求处理,是否应该将其传递给 HTTP 服务器来处理,还是应该使用类似 的状态代码来响应它400 Bad Request?
这可能是服务器决定不处理非 GET 请求的方法的设计决策吗?
webSocket 规范的第 4.1 节(客户端要求)中写道:
请求的方法必须是 GET,并且 HTTP 版本必须至少为 1.1
并且,随后在webSocket 规范的第 4.2.1 节(阅读客户端的打开握手)中,它这样说:
客户的开场握手由以下部分组成。如果服务器在读取握手时发现客户端没有发送与下面的描述相匹配的握手(请注意,根据[RFC2616],标头字段的顺序并不重要),包括但不限于任何违规根据为握手组件指定的 ABNF 语法,服务器必须停止处理客户端的握手并返回带有适当错误代码(例如 400 Bad Request)的 HTTP 响应。
- HTTP/1.1 或更高版本的 GET 请求,包括应解释为第 3 节中定义的 /resource name/ 的“Request-URI”[RFC2616](或包含 /resource name/ 的绝对 HTTP/HTTPS URI)。
所以,有很多地方都说 http 请求必须是 GET。
至于你的具体问题:
WebSocket 服务器应该只处理 GET 请求吗?
是的,webSocket 连接始终以 GET 请求开始,而不是 POST 或任何其他方法。
如果升级请求不是 GET 请求,服务器是否应该将其作为 WebSocket 升级请求处理,是否应该将其传递给 HTTP 服务器来处理,还是应该使用 400 Bad Request 之类的状态代码进行响应?
如规范的上述参考部分所述,服务器应使用类似 400 Bad Request 的状态代码进行响应。
这可能是服务器决定不处理非 GET 请求的方法的设计决策吗?
是的。
| 归档时间: |
|
| 查看次数: |
3335 次 |
| 最近记录: |