Skip to content

Commit 538a96d

Browse files
authored
Merge pull request #7 from smith-30/feature/client_context_takeover
add: context-takeover option to client
2 parents ad97036 + dfe35b7 commit 538a96d

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

client.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)