diff options
author | Bjørn Christian Seime <bjorn.christian@seime.no> | 2023-11-17 13:22:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-17 13:22:26 +0100 |
commit | 31c87dea54a00998e25b85c4239985d21333dd4f (patch) | |
tree | 795bf50254afd21dbb58c3f6cdd521afbdf47dee /container-core | |
parent | c3b845f72b2dd889892887e0ba81bda43c34856b (diff) | |
parent | bfff665b4551e299bb890fcae3b707aff4132527 (diff) |
Merge pull request #29367 from vespa-engine/bjorncs/restapi
Bjorncs/restapi
Diffstat (limited to 'container-core')
-rw-r--r-- | container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java | 8 | ||||
-rw-r--r-- | container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java | 24 |
2 files changed, 30 insertions, 2 deletions
diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java index 39dd17d3563..196a57d23bf 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java @@ -76,7 +76,11 @@ class RestApiImpl implements RestApi { resolvedRoute, requestContext, filters, createFilterContextRecursive(resolvedRoute, requestContext, resolvedRoute.filters, null)); if (filterContext != null) { - return filterContext.executeFirst(); + try { + return filterContext.executeFirst(); + } catch (RuntimeException e) { + return mapException(requestContext, e); + } } else { return dispatchToRoute(resolvedRoute, requestContext); } @@ -496,7 +500,7 @@ class RestApiImpl implements RestApi { } @Override public String getStringOrThrow(String name) { return getString(name) - .orElseThrow(() -> new RestApiException.BadRequest("Path parameter '" + name + "' is missing")); + .orElseThrow(() -> new RestApiException.NotFound("Path parameter '" + name + "' is missing")); } @Override public HttpURL.Path getFullPath() { return pathMatcher.getPath(); diff --git a/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java b/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java index bf0ccb95887..95ccff1a075 100644 --- a/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java +++ b/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java @@ -158,6 +158,30 @@ class RestApiImplTest { assertRequiredCapability(restApi, Method.POST, "/api2", Capability.CONTENT__DOCUMENT_API); } + @Test + void maps_exception_for_filter_throwing() { + RestApi.Filter throwingFilter = (ctx) -> { + throw new RestApiException.Forbidden("forbidden"); + }; + var restApi = RestApi.builder() + .setDefaultRoute(route("{*}").defaultHandler(ctx -> "hello world")) + .addFilter(throwingFilter) + .build(); + verifyJsonResponse(restApi, Method.GET, "/", null, 403, "{\"error-code\":\"FORBIDDEN\",\"message\":\"forbidden\"}"); + } + + @Test + void missing_parameters_are_mapped_to_4xx_response() { + var restApi = RestApi.builder() + .addRoute(route("/missing-path-param").get(ctx -> ctx.pathParameters().getStringOrThrow("missing"))) + .addRoute(route("/missing-query-param").get(ctx -> ctx.queryParameters().getStringOrThrow("missing"))) + .build(); + verifyJsonResponse(restApi, Method.GET, "/missing-path-param", null, 404, + "{\"error-code\":\"NOT_FOUND\",\"message\":\"Path parameter 'missing' is missing\"}"); + verifyJsonResponse(restApi, Method.GET, "/missing-query-param", null, 400, + "{\"error-code\":\"BAD_REQUEST\",\"message\":\"Query parameter 'missing' is missing\"}"); + } + private static void verifyJsonResponse( RestApi restApi, Method method, String path, String requestContent, int expectedStatusCode, String expectedJson) { |