From 255a0f4fc05f336b1cc15903489e77a4e16a1437 Mon Sep 17 00:00:00 2001 From: Danil Zagoskin Date: Sat, 15 Feb 2025 00:32:54 +0300 Subject: [PATCH] better bad request reporting --- src/erf_router.erl | 39 ++++++++++++++++++++------------------- src/erf_util.erl | 7 ++++++- test/erf_SUITE.erl | 2 +- test/erf_router_SUITE.erl | 2 +- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/erf_router.erl b/src/erf_router.erl index cee7ee7..a77b295 100644 --- a/src/erf_router.erl +++ b/src/erf_router.erl @@ -252,7 +252,7 @@ handle_ast(API, #{callback := Callback} = Opts) -> erl_syntax:clause( [ erl_syntax:match_expr( - erl_syntax:variable('Request'), + erl_syntax:variable('Request0'), erl_syntax:map_expr( none, [ @@ -286,6 +286,18 @@ handle_ast(API, #{callback := Callback} = Opts) -> erl_syntax:variable('IsValidRequest'), IsValidRequestAST ), + erl_syntax:match_expr( + erl_syntax:variable('Request'), + erl_syntax:map_expr( + erl_syntax:variable('Request0'), + [ + erl_syntax:map_field_assoc( + erl_syntax:atom('path_parameters'), + erl_syntax:variable('PathParameters') + ) + ] + ) + ), erl_syntax:case_expr( erl_syntax:variable('IsValidRequest'), [ @@ -303,19 +315,7 @@ handle_ast(API, #{callback := Callback} = Opts) -> utf8 ) ), - [ - erl_syntax:map_expr( - erl_syntax:variable('Request'), - [ - erl_syntax:map_field_assoc( - erl_syntax:atom('path_parameters'), - erl_syntax:variable( - 'PathParameters' - ) - ) - ] - ) - ] + [erl_syntax:variable('Request')] ) ] ), @@ -323,16 +323,17 @@ handle_ast(API, #{callback := Callback} = Opts) -> [ erl_syntax:tuple([ erl_syntax:atom(false), - erl_syntax:variable('_Reason') + erl_syntax:variable('Reason') ]) ], none, [ - erl_syntax:tuple( + erl_syntax:application( + erl_syntax:atom(erf_util), + erl_syntax:atom(handle_invalid_request), [ - erl_syntax:integer(400), - erl_syntax:list([]), - erl_syntax:atom(undefined) + erl_syntax:variable('Request'), + erl_syntax:variable('Reason') ] ) ] diff --git a/src/erf_util.erl b/src/erf_util.erl index 76c381b..16a1bf0 100644 --- a/src/erf_util.erl +++ b/src/erf_util.erl @@ -16,7 +16,8 @@ %%% EXTERNAL EXPORTS -export([ to_pascal_case/1, - to_snake_case/1 + to_snake_case/1, + handle_invalid_request/2 ]). %%%----------------------------------------------------------------------------- @@ -86,3 +87,7 @@ to_snake_case([_C | Rest], [$_ | _T] = Acc) -> to_snake_case(Rest, Acc); to_snake_case([_C | Rest], Acc) -> to_snake_case(Rest, [$_ | Acc]). + + +handle_invalid_request(_Request, Reason) -> + {400, [{<<"content-type">>, <<"text/plain">>}], [io_lib:print(Reason), "\n"]}. diff --git a/test/erf_SUITE.erl b/test/erf_SUITE.erl index d0ef7ac..7f703da 100644 --- a/test/erf_SUITE.erl +++ b/test/erf_SUITE.erl @@ -101,7 +101,7 @@ foo(_Conf) -> ), ?assertMatch( - {ok, {{"HTTP/1.1", 400, "Bad Request"}, _Result2Headers, <<>>}}, + {ok, {{"HTTP/1.1", 400, "Bad Request"}, _Result2Headers, <<_/binary>>}}, httpc:request( post, {"http://localhost:8789/1/foo", [], "application/json", <<"\"foobar\"">>}, diff --git a/test/erf_router_SUITE.erl b/test/erf_router_SUITE.erl index 840f1ac..367b501 100644 --- a/test/erf_router_SUITE.erl +++ b/test/erf_router_SUITE.erl @@ -166,7 +166,7 @@ foo(_Conf) -> meck:expect(get_foo_request_body, is_valid, fun(_Value) -> {false, reason} end), - ?assertEqual({400, [], undefined}, Mod:handle(Req)), + ?assertMatch({400, [{<<"content-type">>, _}], _}, Mod:handle(Req)), NotAllowedReq = #{ path => [<<"1">>, <<"foo">>],