@@ -78,6 +78,11 @@ type Dialer struct {
7878 // takeover" modes are supported.
7979 EnableCompression bool
8080
81+ // EnableContextTakeover specifies specifies if the client should attempt to negotiate
82+ // per message compression with context-takeover (RFC 7692).
83+ // but window bits is allowed only 15, because go's flate library support 15 bits only.
84+ EnableContextTakeover bool
85+
8186 // Jar specifies the cookie jar.
8287 // If Jar is nil, cookies are not sent in requests and ignored
8388 // in responses.
@@ -196,7 +201,10 @@ func (d *Dialer) Dial(urlStr string, requestHeader http.Header) (*Conn, *http.Re
196201 }
197202 }
198203
199- if d .EnableCompression {
204+ switch {
205+ case d .EnableCompression && d .EnableContextTakeover :
206+ req .Header .Set ("Sec-Websocket-Extensions" , "permessage-deflate; server_max_window_bits=15; client_max_window_bits=15" )
207+ case d .EnableCompression :
200208 req .Header .Set ("Sec-Websocket-Extensions" , "permessage-deflate; server_no_context_takeover; client_no_context_takeover" )
201209 }
202210
@@ -307,13 +315,20 @@ func (d *Dialer) Dial(urlStr string, requestHeader http.Header) (*Conn, *http.Re
307315 if ext ["" ] != "permessage-deflate" {
308316 continue
309317 }
310- _ , snct := ext ["server_no_context_takeover" ]
311- _ , cnct := ext ["client_no_context_takeover" ]
312- if ! snct || ! cnct {
313- return nil , resp , errInvalidCompression
318+
319+ _ , cmwb := ext ["client_max_window_bits" ]
320+ _ , smwb := ext ["server_max_window_bits" ]
321+
322+ switch {
323+ case cmwb && smwb :
324+ conn .contextTakeover = true
325+ conn .newCompressionWriter = compressContextTakeover
326+ conn .newDecompressionReader = decompressContextTakeover
327+ default :
328+ conn .newCompressionWriter = compressNoContextTakeover
329+ conn .newDecompressionReader = decompressNoContextTakeover
314330 }
315- conn .newCompressionWriter = compressNoContextTakeover
316- conn .newDecompressionReader = decompressNoContextTakeover
331+
317332 break
318333 }
319334
0 commit comments