Browse Source

Fix cowboy:set_env when the env value is missing

Loïc Hoguin 7 years ago
parent
commit
9317751cb3
2 changed files with 19 additions and 3 deletions
  1. 1 1
      src/cowboy.erl
  2. 18 2
      test/misc_SUITE.erl

+ 1 - 1
src/cowboy.erl

@@ -68,6 +68,6 @@ stop_listener(Ref) ->
 -spec set_env(ranch:ref(), atom(), any()) -> ok.
 set_env(Ref, Name, Value) ->
 	Opts = ranch:get_protocol_options(Ref),
-	{_, Env} = maps:find(env, Opts),
+	Env = maps:get(env, Opts, #{}),
 	Opts2 = maps:put(env, maps:put(Name, Value, Env), Opts),
 	ok = ranch:set_protocol_options(Ref, Opts2).

+ 18 - 2
test/misc_SUITE.erl

@@ -20,11 +20,14 @@
 -import(cowboy_test, [gun_open/1]).
 
 all() ->
-	cowboy_test:common_all().
+	[{group, no_env}|cowboy_test:common_all()].
 
 groups() ->
-	cowboy_test:common_groups(ct_helper:all(?MODULE)).
+	Common = ct_helper:all(?MODULE) -- [set_env_missing],
+	[{no_env, [], [set_env_missing]}|cowboy_test:common_groups(Common)].
 
+init_per_group(Name=no_env, Config) ->
+	cowboy_test:init_http(Name, #{}, Config);
 init_per_group(Name, Config) ->
 	cowboy_test:init_common_groups(Name, Config, ?MODULE).
 
@@ -48,3 +51,16 @@ set_env(Config) ->
 	Ref2 = gun:get(ConnPid2, "/"),
 	{response, _, 400, _} = gun:await(ConnPid2, Ref2),
 	ok.
+
+set_env_missing(Config) ->
+	doc("Live replace a middleware environment value when env was not provided."),
+	ConnPid1 = gun_open(Config),
+	Ref1 = gun:get(ConnPid1, "/"),
+	{response, _, 500, _} = gun:await(ConnPid1, Ref1),
+	Listener = proplists:get_value(name, config(tc_group_properties, Config)),
+	cowboy:set_env(Listener, dispatch, []),
+	%% Only new connections get the updated environment.
+	ConnPid2 = gun_open(Config),
+	Ref2 = gun:get(ConnPid2, "/"),
+	{response, _, 400, _} = gun:await(ConnPid2, Ref2),
+	ok.