aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2020-04-16 14:44:23 +0200
committerLoïc Hoguin <[email protected]>2020-04-16 14:44:23 +0200
commit6599fc9a0ce1721271cc070f6d54a677d466c583 (patch)
treeb91135d92fd7b849aa88f06157b6f48d1c310417
parente1a69b36b180a574c0ac314ced9613fdd52312cc (diff)
downloadgun-6599fc9a0ce1721271cc070f6d54a677d466c583.tar.gz
gun-6599fc9a0ce1721271cc070f6d54a677d466c583.tar.bz2
gun-6599fc9a0ce1721271cc070f6d54a677d466c583.zip
Add tests for cookie_ignore_informational option
-rw-r--r--src/gun.erl6
-rw-r--r--src/gun_ws.erl4
-rw-r--r--test/handlers/cookie_informational_h.erl10
-rw-r--r--test/rfc6265bis_SUITE.erl41
4 files changed, 54 insertions, 7 deletions
diff --git a/src/gun.erl b/src/gun.erl
index 6186aa2..f4f1fca 100644
--- a/src/gun.erl
+++ b/src/gun.erl
@@ -310,6 +310,8 @@ check_options([{connect_timeout, T}|Opts]) when is_integer(T), T >= 0 ->
check_options(Opts);
check_options([{cookie_store, {Mod, _}}|Opts]) when is_atom(Mod) ->
check_options(Opts);
+check_options([{cookie_ignore_informational, B}|Opts]) when is_boolean(B) ->
+ check_options(Opts);
check_options([{domain_lookup_timeout, infinity}|Opts]) ->
check_options(Opts);
check_options([{domain_lookup_timeout, T}|Opts]) when is_integer(T), T >= 0 ->
@@ -348,7 +350,7 @@ check_options([{socks_opts, ProtoOpts}|Opts]) when is_map(ProtoOpts) ->
Error ->
Error
end;
-check_options([{supervise, B}|Opts]) when B =:= true; B =:= false ->
+check_options([{supervise, B}|Opts]) when is_boolean(B) ->
check_options(Opts);
check_options([{tcp_opts, L}|Opts]) when is_list(L) ->
check_options(Opts);
@@ -358,7 +360,7 @@ check_options([{tls_handshake_timeout, T}|Opts]) when is_integer(T), T >= 0 ->
check_options(Opts);
check_options([{tls_opts, L}|Opts]) when is_list(L) ->
check_options(Opts);
-check_options([{trace, B}|Opts]) when B =:= true; B =:= false ->
+check_options([{trace, B}|Opts]) when is_boolean(B) ->
check_options(Opts);
check_options([{transport, T}|Opts]) when T =:= tcp; T =:= tls ->
check_options(Opts);
diff --git a/src/gun_ws.erl b/src/gun_ws.erl
index a2271a9..8be93e8 100644
--- a/src/gun_ws.erl
+++ b/src/gun_ws.erl
@@ -64,7 +64,7 @@ do_check_options([{closing_timeout, infinity}|Opts]) ->
do_check_options(Opts);
do_check_options([{closing_timeout, T}|Opts]) when is_integer(T), T > 0 ->
do_check_options(Opts);
-do_check_options([{compress, B}|Opts]) when B =:= true; B =:= false ->
+do_check_options([{compress, B}|Opts]) when is_boolean(B) ->
do_check_options(Opts);
do_check_options([{default_protocol, M}|Opts]) when is_atom(M) ->
do_check_options(Opts);
@@ -81,7 +81,7 @@ do_check_options([Opt={protocols, L}|Opts]) when is_list(L) ->
end;
do_check_options([{reply_to, P}|Opts]) when is_pid(P) ->
do_check_options(Opts);
-do_check_options([{silence_pings, B}|Opts]) when B =:= true; B =:= false ->
+do_check_options([{silence_pings, B}|Opts]) when is_boolean(B) ->
do_check_options(Opts);
do_check_options([{user_opts, _}|Opts]) ->
do_check_options(Opts);
diff --git a/test/handlers/cookie_informational_h.erl b/test/handlers/cookie_informational_h.erl
new file mode 100644
index 0000000..71e1b4a
--- /dev/null
+++ b/test/handlers/cookie_informational_h.erl
@@ -0,0 +1,10 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+-module(cookie_informational_h).
+
+-export([init/2]).
+
+init(Req0, State) ->
+ cowboy_req:inform(103, #{<<"set-cookie">> => [<<"informational=1">>]}, Req0),
+ Req = cowboy_req:reply(204, #{<<"set-cookie">> => [<<"final=1">>]}, Req0),
+ {ok, Req, State}.
diff --git a/test/rfc6265bis_SUITE.erl b/test/rfc6265bis_SUITE.erl
index 0672fec..ecaf45f 100644
--- a/test/rfc6265bis_SUITE.erl
+++ b/test/rfc6265bis_SUITE.erl
@@ -79,9 +79,10 @@ init_routes() -> [
{"/cookie-set/[...]", cookie_set_h, []},
{"/cookies/resources/echo-cookie.html", cookie_echo_h, []},
{"/cookies/resources/set-cookie.html", cookie_set_h, []},
- {<<"/cookies/resources/echo.py">>, cookie_echo_h, []},
- {<<"/cookies/resources/set.py">>, cookie_set_h, []},
- {<<"/ws">>, ws_cookie_h, []}
+ {"/cookies/resources/echo.py", cookie_echo_h, []},
+ {"/cookies/resources/set.py", cookie_set_h, []},
+ {"/informational", cookie_informational_h, []},
+ {"/ws", ws_cookie_h, []}
]}
].
@@ -141,6 +142,40 @@ do_request_test_file(Config) ->
%% Tests.
+dont_ignore_informational_set_cookie(Config) ->
+ doc("User agents may accept set-cookie headers "
+ "sent in informational responses. (RFC6265bis 3)"),
+ [{<<"informational">>, <<"1">>}, {<<"final">>, <<"1">>}]
+ = do_informational_set_cookie(Config, false).
+
+ignore_informational_set_cookie(Config) ->
+ doc("User agents may ignore set-cookie headers "
+ "sent in informational responses. (RFC6265bis 3)"),
+ [{<<"final">>, <<"1">>}]
+ = do_informational_set_cookie(Config, true).
+
+do_informational_set_cookie(Config, Boolean) ->
+ Protocol = config(protocol, Config),
+ {ok, ConnPid} = gun:open("localhost", config(port, Config), #{
+ transport => config(transport, Config),
+ protocols => [Protocol],
+ cookie_store => gun_cookies_list:init(),
+ cookie_ignore_informational => Boolean
+ }),
+ {ok, Protocol} = gun:await_up(ConnPid),
+ StreamRef1 = gun:get(ConnPid, "/informational"),
+ {inform, 103, Headers1} = gun:await(ConnPid, StreamRef1),
+ ct:log("Headers1:~n~p", [Headers1]),
+ {response, fin, 204, Headers2} = gun:await(ConnPid, StreamRef1),
+ ct:log("Headers2:~n~p", [Headers2]),
+ StreamRef2 = gun:get(ConnPid, "/cookie-echo"),
+ {response, nofin, 200, _} = gun:await(ConnPid, StreamRef2),
+ {ok, Body2} = gun:await_body(ConnPid, StreamRef2),
+ ct:log("Body2:~n~p", [Body2]),
+ Res = cow_cookie:parse_cookie(Body2),
+ gun:close(ConnPid),
+ Res.
+
-define(HOST, "web-platform.test").
%% WPT: domain/domain-attribute-host-with-and-without-leading-period