From 96afea1583ec63ed63127b5bbc31b31b5fe969c5 Mon Sep 17 00:00:00 2001 From: Javier Garea Date: Wed, 9 Oct 2024 10:30:28 +0200 Subject: [PATCH] fix: handle not_found and static_routes --- src/erf.erl | 33 +++++++++++++++++--- src/erf_http_server/erf_http_server_elli.erl | 8 ++++- test/erf_SUITE.erl | 10 ++++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/erf.erl b/src/erf.erl index 69ec8fd..14e8c4a 100644 --- a/src/erf.erl +++ b/src/erf.erl @@ -209,7 +209,7 @@ reload_conf(Name, NewConf) -> case build_router(SpecPath, SpecParser, Callback, StaticRoutes, SwaggerUI) of {ok, RouterMod, Router, API} -> - RoutePatterns = route_patterns(API), + RoutePatterns = route_patterns(API, StaticRoutes, SwaggerUI), erf_conf:set(Name, Conf#{ route_patterns => RoutePatterns, router_mod => RouterMod, @@ -243,7 +243,7 @@ init([Name, RawConf]) -> case build_router(SpecPath, SpecParser, Callback, StaticRoutes, SwaggerUI) of {ok, RouterMod, Router, API} -> - RoutePatterns = route_patterns(API), + RoutePatterns = route_patterns(API, StaticRoutes, SwaggerUI), ErfConf = RawErfConf#{ route_patterns => RoutePatterns, router_mod => RouterMod, @@ -395,12 +395,35 @@ match_route_(RawPath, [{Route, RouteRegEx} | Routes]) -> {ok, Route} end. --spec route_patterns(API) -> RoutePatterns when +-spec route_patterns(API, StaticRoutes, SwaggerUI) -> RoutePatterns when API :: api(), + StaticRoutes :: [static_route()], + SwaggerUI :: boolean(), RoutePatterns :: route_patterns(). -route_patterns(API) -> +route_patterns(API, StaticRoutes, SwaggerUI) -> + Acc = + lists:map( + fun + ({Path, {file, _ResourcePath}}) -> + {Path, <<"^", Path/binary, "$">>}; + ({Path, {dir, _ResourcePath}}) -> + {Path, <<"^", Path/binary>>} + end, + StaticRoutes + ), + Acc1 = + case SwaggerUI of + true -> + [ + {<<"/swagger">>, <<"^/swagger$">>}, + {<<"/swagger/spec.json">>, <<"^/swagger/spec.json$">>} + | Acc + ]; + _false -> + Acc + end, RawRoutes = [maps:get(path, Endpoint) || Endpoint <- maps:get(endpoints, API)], - route_patterns(RawRoutes, []). + route_patterns(RawRoutes, Acc1). -spec route_patterns(RawRoutes, Acc) -> RoutePatterns when RawRoutes :: [binary()], diff --git a/src/erf_http_server/erf_http_server_elli.erl b/src/erf_http_server/erf_http_server_elli.erl index 2b51461..352f2b3 100644 --- a/src/erf_http_server/erf_http_server_elli.erl +++ b/src/erf_http_server/erf_http_server_elli.erl @@ -176,7 +176,13 @@ preprocess(Name, Req) -> ElliBody end, JoinPath = erlang:list_to_binary([<<"/">> | lists:join(<<"/">>, Path)]), - {ok, Route} = erf:match_route(Name, JoinPath), + Route = + case erf:match_route(Name, JoinPath) of + {ok, R} -> + R; + {error, not_found} -> + JoinPath + end, #{ scheme => Scheme, host => Host, diff --git a/test/erf_SUITE.erl b/test/erf_SUITE.erl index d5db7d9..d0ef7ac 100644 --- a/test/erf_SUITE.erl +++ b/test/erf_SUITE.erl @@ -120,6 +120,16 @@ foo(_Conf) -> ) ), + ?assertMatch( + {ok, {{"HTTP/1.1", 404, "Not Found"}, _Result3Headers, <<>>}}, + httpc:request( + get, + {"http://localhost:8789/1/not_found", []}, + [], + [{body_format, binary}] + ) + ), + ok = erf:stop(erf_server), meck:unload(erf_callback),