WebSocket客戶端可以請求本規(guī)范的擴展,且WebSocket服務器可以接受一些或所有客戶端請求的擴展。服務器不必響應不是客戶端請求的任何擴展。如果擴展參數(shù)包含在客戶端和服務器之間的協(xié)商中,這些參數(shù)必須按照參數(shù)應用到的擴展規(guī)范來選擇。
客戶端通過包含一個|Sec-WebSocket-Extensions|頭字段請求擴展,其按照正常的HTTP頭字段規(guī)則(參考[RFC2616], 4.2節(jié))并且頭字段的值按照以下ABNF定義[RFC2616]。注意本章使用的ABNF語法/規(guī)則來源于[RFC2616],包括“隱式的 LWS規(guī)范”。如果客戶端或服務器在協(xié)商階段接收到的值不符合下邊的ABNF,這種畸形數(shù)據(jù)的接收人必須立即失敗WebSocket連接*。
Sec-WebSocket-Extensions = extension-list
extension-list = 1#extension
extension = extension-token *( ";" extension-param )
extension-token = registered-token
registered-token = token
extension-param = token [ "=" (token | quoted-string) ]
;當使用引用字符串的語法變種時,引用字符串之后的值必須
;符合’token’ABNF
注意,像其他HTTP頭字段,這個頭字段可以跨多個行分割或組合,因此,以下是等價的:
Sec-WebSocket-Extensions: foo
Sec-WebSocket-Extensions: bar; baz=2
完全等價于
Sec-WebSocket-Extensions: foo, bar; baz=2
所有使用的extension-token必須是一個egistered token(參考11.4節(jié))。任何給定擴展提供的參數(shù)必須被擴展定義。注意,客戶端只需提供使用任何公布的擴展,除非服務器表示它希望使用使用擴展,否則必須使用它們。
注意,擴展的順序是重要的。在多個擴展間的相互作用可以定義在定義擴展的文檔中。在沒有這樣定義的情況下,解釋是它請求中的客戶端列出的頭字段表示一個它希望使用的頭字段的偏好,第一個列出的選項是最優(yōu)選的。服務器在響應中列出的擴展表示擴展是實際正在用于連接的擴展。擴展應該修改數(shù)據(jù)和/或組幀,數(shù)據(jù)的操作順序應該假定是與打開階段握手期間服務器響應中列出的擴展順序是一樣的。
例如,如果有兩個擴展“foo”和“bar”,且如果服務器發(fā)送的頭字段|Sec-WebSocket-Extensions|有值“foo”、“bar”,那么數(shù)據(jù)上的操作將變?yōu)閎ar(foo(data)),是更改數(shù)據(jù)本身(如壓縮)或更改可能“堆疊(stack)”的組幀。
可接受的擴展頭字段(注意:為了可讀性,將折疊較長行)的非規(guī)范化例子:
Sec-WebSocket-Extensions: deflate-stream
Sec-WebSocket-Extensions: mux; max-channels=4; flow-control,
deflate-stream
Sec-WebSocket-Extensions: private-extension
服務器通過包含一個容納了一個或多個擴展的客戶端請求的|Sec-WebSocket-Extensions|頭字段來接受一個或多個擴展。所有擴展參數(shù)的解釋,和什么構成一個有效的到客戶請求的參數(shù)集的服務器響應,將由各個擴展定義。
擴展提供了一種機制來實現(xiàn)選擇性加入的附加協(xié)議特性。本文檔沒有定義任何擴展,但實現(xiàn)可以使用單獨定義的擴展。
更多建議: