请求websocket子目录时的HTTP响应代码为';不支持/认可

请求websocket子目录时的HTTP响应代码为';不支持/认可,http,websocket,http-response-codes,Http,Websocket,Http Response Codes,将HTTP连接升级到websocket时,可以在可选HTTP头“Sec websocket协议”中提供一个或多个子目录 如果服务器接受任何子策略,它将使用HTTP响应代码101(“HTTP/1.1 101交换协议”)进行响应,并包括指示所选子策略的HTTP头“Sec WebSocket Protocol” 但是服务器应该如何正确处理未知/不受支持的子脚本 这应该在HTTP连接内完成吗?使用一些HTTP响应代码 或者应该将连接升级到websocket,并通过发送带有一些预定义websocket状态

将HTTP连接升级到websocket时,可以在可选HTTP头“Sec websocket协议”中提供一个或多个子目录

如果服务器接受任何子策略,它将使用HTTP响应代码101(“HTTP/1.1 101交换协议”)进行响应,并包括指示所选子策略的HTTP头“Sec WebSocket Protocol”

但是服务器应该如何正确处理未知/不受支持的子脚本

这应该在HTTP连接内完成吗?使用一些HTTP响应代码

或者应该将连接升级到websocket,并通过发送带有一些预定义websocket状态代码的“关闭框架”立即由服务器关闭

RFC6455说明了什么?我不能下结论。 现有的服务器实现如何处理它

问候
/根据/

简单浏览一下RFC6455,我认为WebSocket子策略是可选的,并且是经过协商的。在第节“服务器要求”下:


如果服务器不同意与客户端一起使用Subtocol,则不应发送值不是“null”的Subtocol响应标头,客户端有责任在该点继续或终止连接。

WebSocket的整个要点是使用WebSocket运行从客户端到服务器的特定协议。但是客户机和服务器需要知道协议,以便两端都知道如何处理通过的WS消息。WS-message处理与您在TCP级别上的操作没有什么不同。您不必使用protocol字段,它只在您想要强制实现兼容性时才相关


对于Kaazing服务器,我们提供了位于基本websocket层之上的特定协议库。您还可以在Github上找到各种协议库。除了握手之外,其他一切都是使用TCP处理的方式。处理websocket消息并尝试解码协议。握手中的协议字段应该用于确保您的库实际上是匹配的协议库。例如,如果我的服务器讲STOMP,我尝试与我的客户机连接,我想讲STOMP,我的STOMP库应该检查协议字段以确保它匹配。端点可以按照优先顺序指示,例如,它可以说AMQP 0.9和AMQP 1.0,如果两者都可用,则将选择AMQP 1.0。如果其中一个端点不使用另一个端点可以使用的任何协议,那么它可能会返回null,从而终止连接。

据我所知,第4.2.2节有一些信息:“如果服务器不希望同意建议的子协议之一(…)”,但是还不完全清楚连接会发生什么情况。即使我认为在大多数情况下,由于缺乏对子策略的支持,升级到websocket的连接是不必要的,但这似乎是合理的。如果服务器建立连接(表明它没有提供任何请求的子策略),则可以在客户端记录/处理此连接。RFC中的要点是,子策略是协商扩展,非常类似于SSL握手过程中的密码交换。这就是为什么连接应该在客户端终止的原因:如果客户端和服务器不能支持一个公共的子程序,它们显然无法通信,尽管服务器愿意让连接保持打开状态,以备其他可能。是的,这是有意义的。我看了一下浏览器,并做了一些快速测试。通过使用在建立连接时设置的只读“协议”参数,客户端可以处理不受支持的子程序情况。
   /subprotocol/
      Either a single value representing the subprotocol the server
      is ready to use or null.  The value chosen MUST be derived
      from the client's handshake, specifically by selecting one of
      the values from the |Sec-WebSocket-Protocol| field that the
      server is willing to use for this connection (if any).  If the
      client's handshake did not contain such a header field or if
      the server does not agree to any of the client's requested
      subprotocols, the only acceptable value is null.  The absence
      of such a field is equivalent to the null value (meaning that
      if the server does not wish to agree to one of the suggested
      subprotocols, it MUST NOT send back a |Sec-WebSocket-Protocol|
      header field in its response).  The empty string is not the
      same as the null value for these purposes and is not a legal
      value for this field.  The ABNF for the value of this header
      field is (token), where the definitions of constructs and
      rules are as given in [RFC2616].