diff options
author | Loïc Hoguin <[email protected]> | 2017-09-27 16:20:38 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2017-09-27 16:20:38 +0200 |
commit | fda2d150db460dfe66f307d976be021b7fa47722 (patch) | |
tree | 633b02663da15a7a7e5d8a19b6a4ddb545725963 | |
parent | 5fe46ebe64b3fe6c89840691a4172eb5852f0fba (diff) | |
download | cowboy-fda2d150db460dfe66f307d976be021b7fa47722.tar.gz cowboy-fda2d150db460dfe66f307d976be021b7fa47722.tar.bz2 cowboy-fda2d150db460dfe66f307d976be021b7fa47722.zip |
Fix error response when constraint validation fails
-rw-r--r-- | src/cowboy_req.erl | 23 | ||||
-rw-r--r-- | test/req_SUITE.erl | 5 |
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. |