2013-07-25 116 views
2

According to Wikipedia大多数浏览器使用RFC6455或略早一点的握手。我使用的服务器仅支持RFC6455或类似的服务器,它接受Origin:Sec-WebSocket-Origin:,具体取决于指定的版本。检查WebSocket是否是hixie客户端?

Safari 5和iOS 5使用WebSocket的hixie版本。如果缺少WebSocket,我通常会退回到长轮询。 Safari 5有一个WebSocket的对象,但握手是完全不同的。

有没有什么办法可以检测到WebSocket是hixie还是属于safari 5,所以我可以忽略它而不尝试握手?是否有任何方法检查浏览器是否为Safari 5而不依赖于用户代理?

回答

6

根据网页套接字W3C draft in 2009CLOSED常数具有为2的值:

[Constructor(in DOMString url, in optional DOMString protocol)] 
interface WebSocket { 
    ... 
    // ready state 
    const unsigned short CONNECTING = 0; 
    const unsigned short OPEN = 1; 
    const unsigned short CLOSED = 2; 
    ... 
}; 
WebSocket implements EventTarget; 

在W3C草案dated in 2011CLOSED具有值3:

[Constructor(in DOMString url, in optional DOMString protocols)] 
[Constructor(in DOMString url, in optional DOMString[] protocols)] 
interface WebSocket { 
    ... 
    // ready state 
    const unsigned short CONNECTING = 0; 
    const unsigned short OPEN = 1; 
    const unsigned short CLOSING = 2; 
    const unsigned short CLOSED = 3; 
    ... 
}; 

2009草案对应于hixie/hibi-00,而2011年草案与hibi-07及更高版本相符,as seen on the Wikipedia chart

有了这些信息,你可以做一个JavaScript检查这样的:

if("WebSocket" in window && WebSocket.CLOSED > 2) { 
    // hibi-07 to RFC6455 
} else { 
    // No WebSocket, or hixie 
} 

我用的浏览器截屏服务的以下测试页:

​​

的Safari 5和Chrome 12并在下面返回2,而Safari 6和Chrome 14及以上版本返回3为CLOSED

Chrome 13 uses uses hixie,但返回3.这是我能找到的唯一边缘情况。自Chrome自动更新以来,Chrome 13用户应为零。

注意:这些常量在WebSocket构造函数和WebSocket.prototype上都设置。 5.1之前的Safari 5.0仅在WebSocket.prototype上设置这些常量。如果你只打算支持RFC6455及以上,那么WebSocket.CLOSED > 2WebSocket.CLOSED === 3就足够了。

+3

我们正在使用类似的测试,并且最近已经意识到Safari的某些版本(当然是5.0.1)在'WebSocket.prototype'上具有'CLOSED'属性,而不是'WebSocket'。因此我们的测试更像'if(window.WebSocket &&(WebSocket.CLOSED == 2 || WebSocket.prototype.CLOSED == 2)'。 – connec

+1

@connec更新的答案。看起来像5.0,在5.1之前,只设置这些在原型上,5.1和更高版本也将它们设置在构造函数中,所有浏览器(包括最新的Chrome)似乎都将它们设置为原型,因此您可以省略检查中的WebSocket.CLOSED == 2部分。 – Luke

相关问题