aboutsummaryrefslogtreecommitdiffstats
path: root/test/ws_handler_SUITE.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-11-13 15:55:09 +0100
committerLoïc Hoguin <[email protected]>2018-11-13 15:55:09 +0100
commit8d920f3db97067159fcf6ca497979f8e063986dc (patch)
treedf27e618908d6c5635505e74e11440adac11f881 /test/ws_handler_SUITE.erl
parent8164b504534e932df24adb65c5e15ed8d8a9feea (diff)
downloadcowboy-8d920f3db97067159fcf6ca497979f8e063986dc.tar.gz
cowboy-8d920f3db97067159fcf6ca497979f8e063986dc.tar.bz2
cowboy-8d920f3db97067159fcf6ca497979f8e063986dc.zip
Add the {deflate, boolean()} Websocket command
It allows to temporarily disable Websocket compression when it was negotiated. It's ignored otherwise. This can be used as fine-grained control when some frames do not compress well.
Diffstat (limited to 'test/ws_handler_SUITE.erl')
-rw-r--r--test/ws_handler_SUITE.erl42
1 files changed, 41 insertions, 1 deletions
diff --git a/test/ws_handler_SUITE.erl b/test/ws_handler_SUITE.erl
index 2caacca..6e2bb41 100644
--- a/test/ws_handler_SUITE.erl
+++ b/test/ws_handler_SUITE.erl
@@ -50,7 +50,8 @@ init_dispatch(Name) ->
{"/init", ws_init_commands_h, RunOrHibernate},
{"/handle", ws_handle_commands_h, RunOrHibernate},
{"/info", ws_info_commands_h, RunOrHibernate},
- {"/active", ws_active_commands_h, RunOrHibernate}
+ {"/active", ws_active_commands_h, RunOrHibernate},
+ {"/deflate", ws_deflate_commands_h, RunOrHibernate}
]}]).
%% Support functions for testing using Gun.
@@ -217,3 +218,42 @@ websocket_active_false(Config) ->
{ok, {text, <<"Not received until the handler enables active again.">>}}
= receive_ws(ConnPid, StreamRef),
ok.
+
+websocket_deflate_false(Config) ->
+ doc("The {deflate, false} command temporarily disables compression. "
+ "The {deflate, true} command reenables it."),
+ %% We disable context takeover so that the compressed data
+ %% does not change across all frames.
+ {ok, Socket, Headers} = ws_SUITE:do_handshake("/deflate",
+ "Sec-WebSocket-Extensions: permessage-deflate; server_no_context_takeover\r\n", Config),
+ {_, "permessage-deflate; server_no_context_takeover"}
+ = lists:keyfind("sec-websocket-extensions", 1, Headers),
+ %% The handler receives a compressed "Hello" frame and
+ %% sends back a compressed or uncompressed echo intermittently.
+ Mask = 16#11223344,
+ CompressedHello = <<242, 72, 205, 201, 201, 7, 0>>,
+ MaskedHello = ws_SUITE:do_mask(CompressedHello, Mask, <<>>),
+ %% First echo is compressed.
+ ok = gen_tcp:send(Socket, <<1:1, 1:1, 0:2, 1:4, 1:1, 7:7, Mask:32, MaskedHello/binary>>),
+ {ok, <<1:1, 1:1, 0:2, 1:4, 0:1, 7:7, CompressedHello/binary>>} = gen_tcp:recv(Socket, 0, 6000),
+ %% Second echo is not compressed when it is received back.
+ ok = gen_tcp:send(Socket, <<1:1, 1:1, 0:2, 1:4, 1:1, 7:7, Mask:32, MaskedHello/binary>>),
+ {ok, <<1:1, 0:3, 1:4, 0:1, 5:7, "Hello">>} = gen_tcp:recv(Socket, 0, 6000),
+ %% Third echo is compressed again.
+ ok = gen_tcp:send(Socket, <<1:1, 1:1, 0:2, 1:4, 1:1, 7:7, Mask:32, MaskedHello/binary>>),
+ {ok, <<1:1, 1:1, 0:2, 1:4, 0:1, 7:7, CompressedHello/binary>>} = gen_tcp:recv(Socket, 0, 6000),
+ %% Client-initiated close.
+ ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>),
+ {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
+ {error, closed} = gen_tcp:recv(Socket, 0, 6000),
+ ok.
+
+websocket_deflate_ignore_if_not_negotiated(Config) ->
+ doc("The {deflate, boolean()} commands are ignored "
+ "when compression was not negotiated."),
+ {ok, ConnPid, StreamRef} = gun_open_ws(Config, "/deflate", []),
+ _ = [begin
+ gun:ws_send(ConnPid, {text, <<"Hello.">>}),
+ {ok, {text, <<"Hello.">>}} = receive_ws(ConnPid, StreamRef)
+ end || _ <- lists:seq(1, 10)],
+ ok.