From 84aea5d24d9e3bdcfc336da02d906bd33dfe0b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 19 Nov 2018 12:15:40 +0100 Subject: Silence expected errors from the static_handler test suite --- src/cowboy_static.erl | 7 +++++-- test/static_handler_SUITE.erl | 31 ++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/cowboy_static.erl b/src/cowboy_static.erl index 29ac809..19c15c2 100644 --- a/src/cowboy_static.erl +++ b/src/cowboy_static.erl @@ -120,7 +120,7 @@ init_dir(Req, Path, HowToAccess, Extra) when is_list(Path) -> init_dir(Req, Path, HowToAccess, Extra) -> Dir = fullpath(filename:absname(Path)), PathInfo = cowboy_req:path_info(Req), - Filepath = filename:join([Dir|[escape_reserved(P, <<>>) || P <- PathInfo]]), + Filepath = filename:join([Dir|escape_reserved(PathInfo)]), Len = byte_size(Dir), case fullpath(Filepath) of << Dir:Len/binary, $/, _/binary >> -> @@ -131,6 +131,9 @@ init_dir(Req, Path, HowToAccess, Extra) -> {cowboy_rest, Req, error} end. +escape_reserved([]) -> []; +escape_reserved([P|Tail]) -> [escape_reserved(P, <<>>)|escape_reserved(Tail)]. + %% We escape the slash found in path segments because %% a segment corresponds to a directory entry, and %% therefore those slashes are expected to be part of @@ -315,7 +318,7 @@ forbidden(Req, State) -> -spec content_types_provided(Req, State) -> {[{binary(), get_file}], Req, State} when State::state(). -content_types_provided(Req, State={Path, _, Extra}) -> +content_types_provided(Req, State={Path, _, Extra}) when is_list(Extra) -> case lists:keyfind(mimetypes, 1, Extra) of false -> {[{cow_mimetypes:web(Path), get_file}], Req, State}; diff --git a/test/static_handler_SUITE.erl b/test/static_handler_SUITE.erl index d4394c5..7ac31f8 100644 --- a/test/static_handler_SUITE.erl +++ b/test/static_handler_SUITE.erl @@ -54,10 +54,6 @@ groups() -> ]. init_per_suite(Config) -> - %% @todo When we can chain stream handlers, write one - %% to hide these expected errors. - ct:print("This test suite will produce error reports. " - "The path for these expected errors begins with '/bad' or '/char'."), %% Two static folders are created: one in ct_helper's private directory, %% and one in the test run private directory. PrivDir = code:priv_dir(ct_helper) ++ "/static", @@ -81,8 +77,6 @@ init_per_suite(Config) -> [{static_dir, StaticDir}, {char_dir, CharDir}, {chars, Chars}|Config]. end_per_suite(Config) -> - ct:print("This test suite produced error reports. " - "The path for these expected errors begins with '/bad' or '/char'."), %% Special directory. CharDir = config(char_dir, Config), _ = [file:delete(CharDir ++ [$/, C]) || C <- lists:seq(0, 127)], @@ -103,16 +97,23 @@ init_per_group(priv_dir, Config) -> init_per_group(Name=http_no_sendfile, Config) -> cowboy_test:init_http(Name, #{ env => #{dispatch => init_dispatch(Config)}, + middlewares => [?MODULE, cowboy_router, cowboy_handler], sendfile => false }, [{flavor, vanilla}|Config]); init_per_group(Name=h2c_no_sendfile, Config) -> Config1 = cowboy_test:init_http(Name, #{ env => #{dispatch => init_dispatch(Config)}, + middlewares => [?MODULE, cowboy_router, cowboy_handler], sendfile => false }, [{flavor, vanilla}|Config]), lists:keyreplace(protocol, 1, Config1, {protocol, http2}); init_per_group(Name, Config) -> - cowboy_test:init_common_groups(Name, Config, ?MODULE). + Config1 = cowboy_test:init_common_groups(Name, Config, ?MODULE), + Opts = ranch:get_protocol_options(Name), + ok = ranch:set_protocol_options(Name, Opts#{ + middlewares => [?MODULE, cowboy_router, cowboy_handler] + }), + Config1. end_per_group(Name, _) -> cowboy:stop_listener(Name). @@ -182,6 +183,22 @@ init_dispatch(Config) -> {"/bad/ez_priv_dir/[...]", cowboy_static, {priv_dir, static_files_app, "cgi-bin"}} ]}]). +%% Middleware interface to silence expected errors. + +execute(Req=#{path := Path}, Env) -> + case Path of + <<"/bad/priv_dir/app/", _/bits>> -> ct_helper:ignore(cowboy_static, priv_path, 2); + <<"/bad/priv_file/app">> -> ct_helper:ignore(cowboy_static, priv_path, 2); + <<"/bad/priv_dir/route">> -> ct_helper:ignore(cowboy_static, escape_reserved, 1); + <<"/bad/dir/route">> -> ct_helper:ignore(cowboy_static, escape_reserved, 1); + <<"/bad">> -> ct_helper:ignore(cowboy_static, init_opts, 2); + <<"/bad/options">> -> ct_helper:ignore(cowboy_static, content_types_provided, 2); + <<"/bad/options/mime">> -> ct_helper:ignore(cowboy_rest, set_content_type, 2); + <<"/bad/options/etag">> -> ct_helper:ignore(cowboy_static, generate_etag, 2); + _ -> ok + end, + {ok, Req, Env}. + %% Internal functions. -spec do_charset_crash(_) -> no_return(). -- cgit v1.2.3