【譯】 WebSocket 協議第九章——擴展(Extension)

概述

本文爲 WebSocket 協議的第九章,本文翻譯的主要內容爲 WebSocket 擴展相關內容。服務器

有興趣瞭解該文檔以前幾章內容的同窗能夠見:post

擴展(協議正文)

WebSocket 能夠請求該規範中提到的擴展,WebSocket 服務端能夠接受其中一些或者全部的客戶端請求的擴展。服務端禁止響應客戶端沒有請求過的擴展。若是擴展參數須要在客戶端和服務端之間進行協商,這些參數必須根據參數所應用的擴展的規範來選擇。ui

9.1 協商擴展

客戶端經過 Sec-WebSocket-Extensions 請求頭字段來請求擴展,請求頭字段遵照 HTTP 的規則,它的值是經過 ABNF 定義的。注意這一節是經過 ABNF 語法/規則,包括「implied *LWS rule」。若是咱們客戶端或者服務端在協商擴展收到了一個沒有符合下面的 ABNF 規則的值,接收到錯誤的數據的這一方須要馬上讓 WebSocket 關閉鏈接spa

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
複製代碼

是等價於:code

Sec-WebSocket-Extensions: foo, bar; baz=2
複製代碼

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

注意擴展的順序是重要的。多個擴展中的任意的互相做用均可以被定義在這個定義擴展的文檔中。在沒有此類定義的狀況下,客戶端在其請求中列出的頭字段表示其但願使用的頭字段的首選項,其中列出的第一個選項是最可取的。服務器在響應中列出的擴展表示鏈接實際使用的擴展。若是擴展修改了數據或者幀,對數據的操做順序應該被假定爲和連接開始握手的服務端響應的列舉的擴展中的順序相同。token

例如,若是有兩個擴展」foo」和」bar」,而且服務端發送的頭字段Sec-WebSocket-Extensions的值爲」foo,bar」,那麼對數據的操做順序就是bar(foo(data)),是對數據自己的更改(例如壓縮)或者「堆疊」的幀的更改。rem

可接受的擴展標頭字段的非規範性示例(請注意,長線被摺疊以便於閱讀)以下:文檔

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 已知擴展

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

相關文章
相關標籤/搜索