Browse Source

Ignore malformed accept-encoding headers in cowboy_compress_h

Marcos Ferreira 5 years ago
parent
commit
3b85b808ae
2 changed files with 24 additions and 2 deletions
  1. 6 2
      src/cowboy_compress_h.erl
  2. 18 0
      test/compress_SUITE.erl

+ 6 - 2
src/cowboy_compress_h.erl

@@ -71,9 +71,10 @@ early_error(StreamID, Reason, PartialReq, Resp, Opts) ->
 %% Internal.
 
 %% Check if the client supports decoding of gzip responses.
+%%
+%% A malformed accept-encoding header is ignored (no compression).
 check_req(Req) ->
-	%% @todo Probably shouldn't unconditionally crash on failure.
-	case cowboy_req:parse_header(<<"accept-encoding">>, Req) of
+	try cowboy_req:parse_header(<<"accept-encoding">>, Req) of
 		%% Client doesn't support any compression algorithm.
 		undefined ->
 			#state{compress=undefined};
@@ -87,6 +88,9 @@ check_req(Req) ->
 				_ ->
 					#state{compress=gzip}
 			end
+	catch
+		_:_ ->
+			#state{compress=undefined}
 	end.
 
 %% Do not compress responses that contain the content-encoding header.

+ 18 - 0
test/compress_SUITE.erl

@@ -62,6 +62,15 @@ do_get(Path, ReqHeaders, Config) ->
 
 %% Tests.
 
+gzip_accept_encoding_malformed(Config) ->
+	doc("Send malformed accept-encoding; get an uncompressed response."),
+	{200, Headers, _} = do_get("/reply/large",
+		[{<<"accept-encoding">>, <<";">>}], Config),
+	false = lists:keyfind(<<"content-encoding">>, 1, Headers),
+	false = lists:keyfind(<<"vary">>, 1, Headers),
+	{_, <<"100000">>} = lists:keyfind(<<"content-length">>, 1, Headers),
+	ok.
+
 gzip_accept_encoding_missing(Config) ->
 	doc("Don't send accept-encoding; get an uncompressed response."),
 	{200, Headers, _} = do_get("/reply/large",
@@ -80,6 +89,15 @@ gzip_accept_encoding_no_gzip(Config) ->
 	{_, <<"100000">>} = lists:keyfind(<<"content-length">>, 1, Headers),
 	ok.
 
+gzip_accept_encoding_not_supported(Config) ->
+	doc("Send unsupported accept-encoding; get an uncompressed response."),
+	{200, Headers, _} = do_get("/reply/large",
+		[{<<"accept-encoding">>, <<"application/gzip">>}], Config),
+	false = lists:keyfind(<<"content-encoding">>, 1, Headers),
+	false = lists:keyfind(<<"vary">>, 1, Headers),
+	{_, <<"100000">>} = lists:keyfind(<<"content-length">>, 1, Headers),
+	ok.
+
 gzip_reply_content_encoding(Config) ->
 	doc("Reply with content-encoding header; get an uncompressed response."),
 	{200, Headers, _} = do_get("/reply/content-encoding",