aboutsummaryrefslogtreecommitdiffstats
path: root/test/ws_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'test/ws_SUITE.erl')
-rw-r--r--test/ws_SUITE.erl51
1 files changed, 49 insertions, 2 deletions
diff --git a/test/ws_SUITE.erl b/test/ws_SUITE.erl
index 9abeaca..6fa4e61 100644
--- a/test/ws_SUITE.erl
+++ b/test/ws_SUITE.erl
@@ -1,4 +1,4 @@
-%% Copyright (c) 2011-2017, Loïc Hoguin <[email protected]>
+%% Copyright (c) Loïc Hoguin <[email protected]>
%%
%% Permission to use, copy, modify, and/or distribute this software for any
%% purpose with or without fee is hereby granted, provided that the above
@@ -68,7 +68,8 @@ init_dispatch() ->
{"/ws_timeout_cancel", ws_timeout_cancel, []},
{"/ws_max_frame_size", ws_max_frame_size, []},
{"/ws_deflate_opts", ws_deflate_opts_h, []},
- {"/ws_dont_validate_utf8", ws_dont_validate_utf8_h, []}
+ {"/ws_dont_validate_utf8", ws_dont_validate_utf8_h, []},
+ {"/ws_ping", ws_ping_h, []}
]}
]).
@@ -202,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",
@@ -247,6 +267,21 @@ ws_deflate_opts_client_max_window_bits_override(Config) ->
= lists:keyfind("sec-websocket-extensions", 1, Headers2),
ok.
+%% @todo This might be better in an rfc7692_SUITE.
+%%
+%% 7.1.2.2
+%% If a received extension negotiation offer doesn't have the
+%% "client_max_window_bits" extension parameter, the corresponding
+%% extension negotiation response to the offer MUST NOT include the
+%% "client_max_window_bits" extension parameter.
+ws_deflate_opts_client_max_window_bits_only_in_server(Config) ->
+ doc("Handler is configured with non-default client max window bits but "
+ "client doesn't send the parameter; compression is disabled."),
+ {ok, _, Headers} = do_handshake("/ws_deflate_opts?client_max_window_bits",
+ "Sec-WebSocket-Extensions: permessage-deflate\r\n", Config),
+ false = lists:keyfind("sec-websocket-extensions", 1, Headers),
+ ok.
+
ws_deflate_opts_server_context_takeover(Config) ->
doc("Handler is configured with server context takeover enabled."),
{ok, _, Headers1} = do_handshake("/ws_deflate_opts?server_context_takeover",
@@ -341,6 +376,7 @@ ws_first_frame_with_handshake(Config) ->
{ok, <<1:1, 0:3, 1:4, 0:1, 5:7, "Hello">>} = gen_tcp:recv(Socket, 0, 6000),
ok.
+%% @todo Move these tests to ws_handler_SUITE.
ws_init_return_ok(Config) ->
doc("Handler does nothing."),
{ok, Socket, _} = do_handshake("/ws_init?ok", Config),
@@ -471,6 +507,17 @@ ws_max_frame_size_intermediate_fragment_close(Config) ->
{error, closed} = gen_tcp:recv(Socket, 0, 6000),
ok.
+ws_ping(Config) ->
+ doc("Server initiated pings can receive a pong in response."),
+ {ok, Socket, _} = do_handshake("/ws_ping", Config),
+ %% Receive a server-sent ping.
+ {ok, << 1:1, 0:3, 9:4, 0:1, 0:7 >>} = gen_tcp:recv(Socket, 0, 6000),
+ %% Send a pong back with a 0 mask.
+ ok = gen_tcp:send(Socket, << 1:1, 0:3, 10:4, 1:1, 0:7, 0:32 >>),
+ %% Receive a text frame as a result.
+ {ok, << 1:1, 0:3, 1:4, 0:1, 4:7, "OK!!" >>} = gen_tcp:recv(Socket, 0, 6000),
+ ok.
+
ws_send_close(Config) ->
doc("Server-initiated close frame ends the connection."),
{ok, Socket, _} = do_handshake("/ws_send_close", Config),