【譯】 WebSocket 協議第九章——擴充套件(Extension)

黃Java發表於2019-01-26

概述

本文為 WebSocket 協議的第九章,本文翻譯的主要內容為 WebSocket 擴充套件相關內容。

有興趣瞭解該文件之前幾章內容的同學可以見:

擴充套件(協議正文)

WebSocket 可以請求該規範中提到的擴充套件,WebSocket 服務端可以接受其中一些或者所有的客戶端請求的擴充套件。服務端禁止響應客戶端沒有請求過的擴充套件。如果擴充套件引數需要在客戶端和服務端之間進行協商,這些引數必須根據引數所應用的擴充套件的規範來選擇。

9.1 協商擴充套件

客戶端通過 Sec-WebSocket-Extensions 請求頭欄位來請求擴充套件,請求頭欄位遵守 HTTP 的規則,它的值是通過 ABNF 定義的。注意這一節是通過 ABNF 語法/規則,包括“implied *LWS rule”。如果我們客戶端或者服務端在協商擴充套件收到了一個沒有符合下面的 ABNF 規則的值,接收到錯誤的資料的這一方需要立刻讓 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
複製程式碼

任何一個擴充套件憑證都必須是一個註冊過的憑證。(見底 11.4 節)。擴充套件所使用的任何引數都必須是定義給這個擴充套件的。注意,客戶端只能建議使用任意存在的擴充套件而不能使用它們,除非服務端表示他們希望使用這個擴充套件。

注意擴充套件的順序是重要的。多個擴充套件中的任意的互相作用都可以被定義在這個定義擴充套件的文件中。在沒有此類定義的情況下,客戶端在其請求中列出的頭欄位表示其希望使用的頭欄位的首選項,其中列出的第一個選項是最可取的。伺服器在響應中列出的擴充套件表示連線實際使用的擴充套件。如果擴充套件修改了資料或者幀,對資料的操作順序應該被假定為和連結開始握手的服務端響應的列舉的擴充套件中的順序相同。

例如,如果有兩個擴充套件”foo”和”bar”,並且服務端傳送的頭欄位Sec-WebSocket-Extensions的值為”foo,bar”,那麼對資料的操作順序就是bar(foo(data)),是對資料本身的更改(例如壓縮)或者“堆疊”的幀的更改。

可接受的擴充套件標頭欄位的非規範性示例(請注意,長線被摺疊以便於閱讀)如下:

Sec-WebSocket-Extensions: deflate-stream
Sec-WebSocket-Extensions: mux; max-channels=4; flow-control, deflate-stream
Sec-WebSocket-Extensions: private-extension
複製程式碼

服務端接受一個或者多個擴充套件欄位,這些擴充套件欄位是包含客戶端請求的Sec-WebSocket-Extensions頭欄位擴充套件中的。任何通過服務端構成的能夠響應來自客戶端請求的引數的擴充套件引數,將由每個擴充套件定義。

9.2 已知擴充套件

擴充套件為實現方式提供了一個機制,即選擇使用附加功能協議。這個文件中不定義任何擴充套件,但是實現跨越使用單獨定義的擴充套件。

相關文章