0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 04:10:24 +00:00

Add test to ensure max_frame_size works for decompressed data

This commit is contained in:
Loïc Hoguin 2025-01-22 14:34:33 +01:00
parent c35c754f5a
commit 091d1e6e67
No known key found for this signature in database
GPG key ID: 8A9DF795F6FED764
2 changed files with 20 additions and 1 deletions

View file

@ -203,6 +203,25 @@ do_ws_version(Socket) ->
{error, closed} = gen_tcp:recv(Socket, 0, 6000),
ok.
ws_deflate_max_frame_size_close(Config) ->
doc("Server closes connection when decompressed frame size exceeds max_frame_size option"),
%% max_frame_size is set to 8 bytes in ws_max_frame_size.
{ok, Socket, Headers} = do_handshake("/ws_max_frame_size",
"Sec-WebSocket-Extensions: permessage-deflate\r\n", Config),
{_, "permessage-deflate"} = lists:keyfind("sec-websocket-extensions", 1, Headers),
Mask = 16#11223344,
Z = zlib:open(),
zlib:deflateInit(Z, best_compression, deflated, -15, 8, default),
CompressedData0 = iolist_to_binary(zlib:deflate(Z, <<0:800>>, sync)),
CompressedData = binary:part(CompressedData0, 0, byte_size(CompressedData0) - 4),
MaskedData = do_mask(CompressedData, Mask, <<>>),
Len = byte_size(MaskedData),
true = Len < 8,
ok = gen_tcp:send(Socket, << 1:1, 1:1, 0:2, 1:4, 1:1, Len:7, Mask:32, MaskedData/binary >>),
{ok, << 1:1, 0:3, 8:4, 0:1, 2:7, 1009:16 >>} = gen_tcp:recv(Socket, 0, 6000),
{error, closed} = gen_tcp:recv(Socket, 0, 6000),
ok.
ws_deflate_opts_client_context_takeover(Config) ->
doc("Handler is configured with client context takeover enabled."),
{ok, _, Headers1} = do_handshake("/ws_deflate_opts?client_context_takeover",

View file

@ -5,7 +5,7 @@
-export([websocket_info/2]).
init(Req, State) ->
{cowboy_websocket, Req, State, #{max_frame_size => 8}}.
{cowboy_websocket, Req, State, #{max_frame_size => 8, compress => true}}.
websocket_handle({text, Data}, State) ->
{[{text, Data}], State};