处理JavaScript客户端中不成功的WebSocket升级请求

5

我希望能够通过javascript客户端进程获取服务器返回的HTTP状态码,当客户端发起websocket升级请求并且该请求失败时。

我的服务器返回HTTP 400来表示websocket升级失败。

我正在使用Google Chrome,当我打开开发者控制台时,可以看到以下消息:

WebSocket连接到'wss://'失败:WebSocket握手期间出错:意外响应代码:400

然而,onerror处理程序不包含此消息,它接收到1006错误,但没有表明关闭是由于获得HTTP 400而导致的。

javascript开发人员如何处理握手错误?当他们遇到握手错误时,我想向客户端提供有用的信息。

我已经将websocket错误放在下面,似乎没有任何内容可以用来指示此错误是websocket握手错误的结果。

 Websocket Error: {"path":{"length":0},"cancelBubble":false,"returnValue":true,"srcElement":{"binaryType":"blob","protocol":"","extensions":"","bufferedAmount":0,"readyState":3,"url":"wss://<my address>","URL":"wss://<my address>"},"defaultPrevented":false,"timeStamp":1417828938039,"cancelable":false,"bubbles":false,"eventPhase":2,"currentTarget":{"binaryType":"blob","protocol":"","extensions":"","bufferedAmount":0,"readyState":3,"url":"wss://<my address>","URL":"wss://<my address>"},"target":{"binaryType":"blob","protocol":"","extensions":"","bufferedAmount":0,"readyState":3,"url":"wss://<my address>","URL":"wss://<my address>"},"type":"error"}
1个回答

5

很抱歉,Javascript无法知道协商的HTTP状态码。

已定义了关闭代码, 而1006仅表示连接突然关闭,但协议甚至允许在不提供原因的情况下关闭连接。结合readyState API,这些是你诊断问题原因的唯一工具。


是的,似乎无法区分WebSocket连接失败是因为无效的身份验证凭据(即作为查询参数传递的凭据)还是因为网络故障或任何其他原因导致的。由于这种限制,我不得不实现一个次要的(自定义)握手来在WebSocket连接建立后进行身份验证(而不是使用标准的WebSocket握手)。没有成功/失败状态的透明度,可靠的身份验证就不可行。 - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接