Skip to content

Commit

Permalink
Disable WS compression when only server sets client_max_window_bits
Browse files Browse the repository at this point in the history
When the client does not provide the "client_max_window_bits" option,
the server must be able to handle a sliding window of up to 32,768 bytes.

When the server has configured a lower limit than the default, and the
client has not provided the parameter, compression must be disabled.

Co-authored-by: Ignacio Martínez <[email protected]>
  • Loading branch information
2 people authored and essen committed Jan 23, 2025
1 parent e3fbd81 commit 8e02c78
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/cow_ws.erl
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,13 @@ negotiate_permessage_deflate1(Params, Extensions, Opts) ->
ignore;
{#{client_max_window_bits := CB}, _} when CB > ClientMaxWindowBits ->
ignore;
%% When the server requires a client_max_window_bits lower than the
%% default, but the client does not support the parameter (the client
%% didn't send the parameter), fail the negotiation. (RFC7692 7.1.2.2)
{Negotiated, _} when
not is_map_key(client_max_window_bits_set, Negotiated),
ClientMaxWindowBits < 15 ->
ignore;
{Negotiated, RespParams2} ->
%% We add the configured max window bits if necessary.
RespParams = case Negotiated of
Expand Down Expand Up @@ -167,12 +174,14 @@ negotiate_params([{<<"client_max_window_bits">>, Max}|Tail], Negotiated, RespPar
error ->
ignore;
CB when CB =< CB0 ->
negotiate_params(Tail, Negotiated#{client_max_window_bits => CB},
negotiate_params(Tail, Negotiated#{
client_max_window_bits => CB,
client_max_window_bits_set => true},
[<<"; client_max_window_bits=">>, Max|RespParams]);
%% When the client sends window bits larger than the server wants
%% to use, we use what the server defined.
_ ->
negotiate_params(Tail, Negotiated,
negotiate_params(Tail, Negotiated#{client_max_window_bits_set => true},
[<<"; client_max_window_bits=">>, integer_to_binary(CB0)|RespParams])
end;
negotiate_params([{<<"server_max_window_bits">>, Max}|Tail], Negotiated, RespParams) ->
Expand Down

0 comments on commit 8e02c78

Please sign in to comment.