根据WebSocket RFC(RFC6455#section-4.2.1):
如果服务器在读取握手时发现客户端没有发送与下面描述匹配的握手,则服务器必须停止处理客户端的握手并返回HTTP响应适当的错误代码(例如400 Bad Request)。
- HTTP / 1.1或更高版本的GET请求,包括" Request-URI" [RFC2616]应解释为第3节中定义的/资源名称(或包含/资源名称/的绝对HTTP / HTTPS URI)。
醇>[等等...]
当客户端的握手消息改为指定HTTP/1.0
(或者甚至更低的版本号?)时,我不确定是否适合使用HTTP/1.1 400 \r\n\r\n
进行响应(RFC7231#section-6.5.1):
400(错误请求)状态代码表示服务器由于被认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架或欺骗性请求路由)而无法或不会处理请求
我认为HTTP版本号是否过低会被视为客户端错误取决于如何解释客户端握手消息:
要么...
...或...
如果是后者,状态代码为400是有意义的,因为客户端明显违反了WebSocket标准。
如果是前者,状态代码400没有意义,因为该消息作为HTTP消息有效;并且状态代码505可能更可取:(RFC7231#section-6.6.6)
505(不支持HTTP版本)状态代码表示服务器不支持或拒绝支持请求消息中使用的主要HTTP版本。服务器指示它不能或不愿意使用与客户端相同的主要版本来完成请求,如[RFC7230]的第2.6节所述,除了此错误消息。服务器应该为505响应生成一个表示,该表示描述了不支持该版本的原因以及该服务器支持的其他协议。
然后再说一遍,我不喜欢返回5XX类状态代码的想法,因为它或多或少暗示服务器因抛出错误而出错...
编辑:正如我在下面的评论中提到的,大多数模糊不清可能源于我不检查客户端是否甚至意味着升级到WebSocket的事实。