aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2017-09-27 16:20:38 +0200
committerLoïc Hoguin <[email protected]>2017-09-27 16:20:38 +0200
commitfda2d150db460dfe66f307d976be021b7fa47722 (patch)
tree633b02663da15a7a7e5d8a19b6a4ddb545725963
parent5fe46ebe64b3fe6c89840691a4172eb5852f0fba (diff)
downloadcowboy-fda2d150db460dfe66f307d976be021b7fa47722.tar.gz
cowboy-fda2d150db460dfe66f307d976be021b7fa47722.tar.bz2
cowboy-fda2d150db460dfe66f307d976be021b7fa47722.zip
Fix error response when constraint validation fails
-rw-r--r--src/cowboy_req.erl23
-rw-r--r--test/req_SUITE.erl5
2 files changed, 20 insertions, 8 deletions
diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl
index e916976..40aa652 100644
--- a/src/cowboy_req.erl
+++ b/src/cowboy_req.erl
@@ -194,7 +194,13 @@ parse_qs(#{qs := Qs}) ->
-spec match_qs(cowboy:fields(), req()) -> map().
match_qs(Fields, Req) ->
- filter(Fields, kvlist_to_map(Fields, parse_qs(Req))).
+ case filter(Fields, kvlist_to_map(Fields, parse_qs(Req))) of
+ {ok, Map} ->
+ Map;
+ {error, Errors} ->
+ exit({request_error, {match_qs, Errors},
+ 'Query string validation constraints failed for the reasons provided.'})
+ end.
-spec uri(req()) -> iodata().
uri(Req) ->
@@ -407,7 +413,13 @@ parse_cookies(Req) ->
-spec match_cookies(cowboy:fields(), req()) -> map().
match_cookies(Fields, Req) ->
- filter(Fields, kvlist_to_map(Fields, parse_cookies(Req))).
+ case filter(Fields, kvlist_to_map(Fields, parse_cookies(Req))) of
+ {ok, Map} ->
+ Map;
+ {error, Errors} ->
+ exit({request_error, {match_cookies, Errors},
+ 'Cookie validation constraints failed for the reasons provided.'})
+ end.
%% Request body.
@@ -803,12 +815,7 @@ kvlist_to_map(Keys, [{Key, Value}|Tail], Map) ->
end.
filter(Fields, Map0) ->
- case filter(Fields, Map0, #{}) of
- {ok, Map} ->
- Map;
- {error, Errors} ->
- exit({validation_failed, Errors})
- end.
+ filter(Fields, Map0, #{}).
%% Loop through fields, if value is missing and no default,
%% record the error; else if value is missing and has a
diff --git a/test/req_SUITE.erl b/test/req_SUITE.erl
index 3a223d9..66d42c9 100644
--- a/test/req_SUITE.erl
+++ b/test/req_SUITE.erl
@@ -171,6 +171,9 @@ match_cookies(Config) ->
<<"#{c => <<\"d\">>}">> = do_get_body("/match/cookies/c", [{<<"cookie">>, "a=b; c=d"}], Config),
<<"#{a => <<\"b\">>,c => <<\"d\">>}">> = do_get_body("/match/cookies/a/c",
[{<<"cookie">>, "a=b; c=d"}], Config),
+ %% Ensure match errors result in a 400 response.
+ {400, _, _} = do_get("/match/cookies/a/c",
+ [{<<"cookie">>, "a=b"}], Config),
%% This function is tested more extensively through unit tests.
ok.
@@ -183,6 +186,8 @@ match_qs(Config) ->
<<"#{a => <<\"b\">>,c => <<\"d\">>}">> = do_get_body("/match/qs/a/c?a=b&c=d", Config),
<<"#{a => <<\"b\">>,c => true}">> = do_get_body("/match/qs/a/c?a=b&c", Config),
<<"#{a => true,c => <<\"d\">>}">> = do_get_body("/match/qs/a/c?a&c=d", Config),
+ %% Ensure match errors result in a 400 response.
+ {400, _, _} = do_get("/match/qs/a/c?a=b", [], Config),
%% This function is tested more extensively through unit tests.
ok.