当客户端在websocket打开握手中指定HTTP / 1.0时,返回的最合适的HTTP状态代码是什么?

时间:2016-02-13 08:40:29

标签: http websocket http-status-codes http-1.1 http-1.0

根据WebSocket RFC(RFC6455#section-4.2.1):

  

如果服务器在读取握手时发现客户端没有发送与下面描述匹配的握手,则服务器必须停止处理客户端的握手并返回HTTP响应适当的错误代码(例如400 Bad Request)。

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

    [等等...]

当客户端的握手消息改为指定HTTP/1.0(或者甚至更低的版本号?)时,我不确定是否适合使用HTTP/1.1 400 \r\n\r\n进行响应(RFC7231#section-6.5.1):

  

400(错误请求)状态代码表示服务器由于被认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架或欺骗性请求路由)而无法或不会处理请求

我认为HTTP版本号是否过低会被视为客户端错误取决于如何解释客户端握手消息:

要么...

  • 客户端握手消息是一条普通的HTTP1.1消息(如果它包含一组特定的HTTP头,则可能导致将来升级到WebSocket。)

...或...

  • 客户端握手消息实际上不是HTTP1.1消息,但实际上是一条消息,它是WebSocket标准的一部分,只是伪装成HTTP1.1消息。

如果是后者,状态代码为400是有意义的,因为客户端明显违反了WebSocket标准。

如果是前者,状态代码400没有意义,因为该消息作为HTTP消息有效;并且状态代码505可能更可取:(RFC7231#section-6.6.6

  

505(不支持HTTP版本)状态代码表示服务器不支持或拒绝支持请求消息中使用的主要HTTP版本。服务器指示它不能或不愿意使用与客户端相同的主要版本来完成请求,如[RFC7230]的第2.6节所述,除了此错误消息。服务器应该为505响应生成一个表示,该表示描述了不支持该版本的原因以及该服务器支持的其他协议。

然后再说一遍,我不喜欢返回5XX类状态代码的想法,因为它或多或少暗示服务器因抛出错误而出错...

编辑:正如我在下面的评论中提到的,大多数模糊不清可能源于我不检查客户端是否甚至意味着升级到WebSocket的事实。

0 个答案:

没有答案