2013-07-25 140 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

相關問題