Browse Source

Don't crash in delete_resp_header if no resp headers are set

Loïc Hoguin 7 years ago
parent
commit
3a7b411143
2 changed files with 11 additions and 5 deletions
  1. 4 1
      src/cowboy_req.erl
  2. 7 4
      test/handlers/resp_h.erl

+ 4 - 1
src/cowboy_req.erl

@@ -688,7 +688,10 @@ has_resp_body(_) ->
 -spec delete_resp_header(binary(), Req)
 -spec delete_resp_header(binary(), Req)
 	-> Req when Req::req().
 	-> Req when Req::req().
 delete_resp_header(Name, Req=#{resp_headers := RespHeaders}) ->
 delete_resp_header(Name, Req=#{resp_headers := RespHeaders}) ->
-	Req#{resp_headers => maps:remove(Name, RespHeaders)}.
+	Req#{resp_headers => maps:remove(Name, RespHeaders)};
+%% There are no resp headers so we have nothing to delete.
+delete_resp_header(Name, Req) ->
+	Req.
 
 
 -spec inform(cowboy:http_status(), req()) -> ok.
 -spec inform(cowboy:http_status(), req()) -> ok.
 inform(Status, Req) ->
 inform(Status, Req) ->

+ 7 - 4
test/handlers/resp_h.erl

@@ -94,10 +94,13 @@ do(<<"has_resp_body">>, Req0, Opts) ->
 			{ok, cowboy_req:reply(200, #{}, Req), Opts}
 			{ok, cowboy_req:reply(200, #{}, Req), Opts}
 	end;
 	end;
 do(<<"delete_resp_header">>, Req0, Opts) ->
 do(<<"delete_resp_header">>, Req0, Opts) ->
-	false = cowboy_req:has_resp_header(<<"content-type">>, Req0),
-	Req1 = cowboy_req:set_resp_header(<<"content-type">>, <<"text/plain">>, Req0),
-	true = cowboy_req:has_resp_header(<<"content-type">>, Req1),
-	Req = cowboy_req:delete_resp_header(<<"content-type">>, Req1),
+	%% We try to delete first even though it hasn't been set to
+	%% make sure this noop is possible.
+	Req1 = cowboy_req:delete_resp_header(<<"content-type">>, Req0),
+	false = cowboy_req:has_resp_header(<<"content-type">>, Req1),
+	Req2 = cowboy_req:set_resp_header(<<"content-type">>, <<"text/plain">>, Req1),
+	true = cowboy_req:has_resp_header(<<"content-type">>, Req2),
+	Req = cowboy_req:delete_resp_header(<<"content-type">>, Req2),
 	false = cowboy_req:has_resp_header(<<"content-type">>, Req),
 	false = cowboy_req:has_resp_header(<<"content-type">>, Req),
 	{ok, cowboy_req:reply(200, #{}, "OK", Req), Opts};
 	{ok, cowboy_req:reply(200, #{}, "OK", Req), Opts};
 do(<<"inform2">>, Req0, Opts) ->
 do(<<"inform2">>, Req0, Opts) ->