summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorn.christian@seime.no>2023-11-17 13:22:26 +0100
committerGitHub <noreply@github.com>2023-11-17 13:22:26 +0100
commit31c87dea54a00998e25b85c4239985d21333dd4f (patch)
tree795bf50254afd21dbb58c3f6cdd521afbdf47dee /container-core
parentc3b845f72b2dd889892887e0ba81bda43c34856b (diff)
parentbfff665b4551e299bb890fcae3b707aff4132527 (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.java8
-rw-r--r--container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java24
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) {