Skip to content

Commit

Permalink
Disable ws compression if constraints clash
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.

In case that the window has a lower limit set by options, compression must
be disabled.

Co-authored-by: Ignacio Martínez <[email protected]>
  • Loading branch information
Kuroneer and imrivera committed Oct 7, 2021
1 parent 0f5c2f8 commit a6fd4f1
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/cow_ws.erl
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ negotiate_permessage_deflate1(Params, Extensions, Opts) ->
ignore;
{#{client_max_window_bits := CB}, _} when CB > ClientMaxWindowBits ->
ignore;
{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 @@ -165,12 +167,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 a6fd4f1

Please sign in to comment.