diff options
author | HÃ¥kon Hallingstad <hakon@verizonmedia.com> | 2021-04-13 13:29:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-13 13:29:28 +0200 |
commit | 9c56063bb3d68108d391aa6d8441d211b04ab38b (patch) | |
tree | 834d0c08b146ce49bac5057c8d6a9377817a8020 /container-core | |
parent | 73abec5c5354cbff70a4aa9a6fba78c5848b0b13 (diff) | |
parent | 32ee992e5cfc6f11a022cc62e658a6f2cf1d25a5 (diff) |
Merge pull request #17385 from vespa-engine/bjorncs/rewrite-to-request-handler
Bjorncs/rewrite to request handler
Diffstat (limited to 'container-core')
6 files changed, 47 insertions, 12 deletions
diff --git a/container-core/src/main/java/com/yahoo/restapi/ErrorResponse.java b/container-core/src/main/java/com/yahoo/restapi/ErrorResponse.java index d3e81a10720..1885a0c970c 100644 --- a/container-core/src/main/java/com/yahoo/restapi/ErrorResponse.java +++ b/container-core/src/main/java/com/yahoo/restapi/ErrorResponse.java @@ -5,6 +5,7 @@ import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; import static com.yahoo.jdisc.Response.Status.BAD_REQUEST; +import static com.yahoo.jdisc.Response.Status.CONFLICT; import static com.yahoo.jdisc.Response.Status.FORBIDDEN; import static com.yahoo.jdisc.Response.Status.INTERNAL_SERVER_ERROR; import static com.yahoo.jdisc.Response.Status.METHOD_NOT_ALLOWED; @@ -24,7 +25,8 @@ public class ErrorResponse extends SlimeJsonResponse { FORBIDDEN, METHOD_NOT_ALLOWED, INTERNAL_SERVER_ERROR, - UNAUTHORIZED + UNAUTHORIZED, + CONFLICT } public ErrorResponse(int statusCode, String errorType, String message) { @@ -63,4 +65,8 @@ public class ErrorResponse extends SlimeJsonResponse { return new ErrorResponse(METHOD_NOT_ALLOWED, errorCodes.METHOD_NOT_ALLOWED.name(), message); } + public static ErrorResponse conflict(String message) { + return new ErrorResponse(CONFLICT, errorCodes.CONFLICT.name(), message); + } + } diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApi.java b/container-core/src/main/java/com/yahoo/restapi/RestApi.java index df05723ac14..6f5bf298de3 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApi.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApi.java @@ -22,6 +22,7 @@ public interface RestApi { static RouteBuilder route(String pathPattern) { return new RestApiImpl.RouteBuilderImpl(pathPattern); } HttpResponse handleRequest(HttpRequest request); + ObjectMapper jacksonJsonMapper(); interface Builder { Builder setObjectMapper(ObjectMapper mapper); diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiException.java b/container-core/src/main/java/com/yahoo/restapi/RestApiException.java index ac3aa647b87..da853f91402 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApiException.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApiException.java @@ -41,7 +41,10 @@ public class RestApiException extends RuntimeException { public HttpResponse response() { return response; } public static class NotFoundException extends RestApiException { - public NotFoundException() { super(ErrorResponse::notFoundError, "Not Found", null); } + public NotFoundException() { this(null, null); } + public NotFoundException(Throwable cause) { this(cause.getMessage(), cause); } + public NotFoundException(String message) { this(message, null); } + public NotFoundException(String message, Throwable cause) { super(ErrorResponse::notFoundError, message, cause); } } public static class MethodNotAllowed extends RestApiException { @@ -52,12 +55,14 @@ public class RestApiException extends RuntimeException { } public static class BadRequest extends RestApiException { - public BadRequest(String message) { super(ErrorResponse::badRequest, message, null); } + public BadRequest(String message) { this(message, null); } + public BadRequest(Throwable cause) { this(cause.getMessage(), cause); } public BadRequest(String message, Throwable cause) { super(ErrorResponse::badRequest, message, cause); } } public static class InternalServerError extends RestApiException { - public InternalServerError(String message) { super(ErrorResponse::internalServerError, message, null); } + public InternalServerError(String message) { this(message, null); } + public InternalServerError(Throwable cause) { this(cause.getMessage(), cause); } public InternalServerError(String message, Throwable cause) { super(ErrorResponse::internalServerError, message, cause); } } @@ -65,4 +70,10 @@ public class RestApiException extends RuntimeException { public Forbidden(String message) { super(ErrorResponse::forbidden, message, null); } public Forbidden(String message, Throwable cause) { super(ErrorResponse::forbidden, message, cause); } } + + public static class Conflict extends RestApiException { + public Conflict() { this("Conflict", null); } + public Conflict(String message) { this(message, null); } + public Conflict(String message, Throwable cause) { super(ErrorResponse::conflict, message, cause); } + } } 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 e6c6d7ccb62..084aa01ec40 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java @@ -70,6 +70,8 @@ class RestApiImpl implements RestApi { } } + @Override public ObjectMapper jacksonJsonMapper() { return jacksonJsonMapper; } + private HttpResponse dispatchToRoute(Route route, RequestContextImpl context) { HandlerHolder<?> resolvedHandler = resolveHandler(context, route); RequestMapperHolder<?> resolvedRequestMapper = resolveRequestMapper(resolvedHandler); @@ -347,7 +349,10 @@ class RestApiImpl implements RestApi { @Override public ObjectMapper jacksonJsonMapper() { return jacksonJsonMapper; } @Override public UriBuilder uriBuilder() { URI uri = request.getUri(); - return new UriBuilder(uri.getScheme() + "://" + uri.getHost() + ':' + uri.getPort()); + int uriPort = uri.getPort(); + return uriPort != -1 + ? new UriBuilder(uri.getScheme() + "://" + uri.getHost() + ':' + uriPort) + : new UriBuilder(uri.getScheme() + "://" + uri.getHost()); } private class PathParametersImpl implements RestApi.RequestContext.PathParameters { diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiRequestHandler.java b/container-core/src/main/java/com/yahoo/restapi/RestApiRequestHandler.java index 9fe813903dd..5640bbc5445 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApiRequestHandler.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApiRequestHandler.java @@ -32,5 +32,5 @@ public abstract class RestApiRequestHandler<T extends RestApiRequestHandler<T>> @Override public final HttpResponse handle(HttpRequest request) { return restApi.handleRequest(request); } - protected RestApi restApi() { return restApi; } + public RestApi restApi() { return restApi; } } 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 1de8184ce22..06fc6d80741 100644 --- a/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java +++ b/container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java @@ -102,13 +102,25 @@ class RestApiImplTest { verifyJsonResponse(restApi, Method.POST, "/api", rawJson, 200, rawJson); } + @Test + public void uri_builder_creates_valid_uri_prefix() { + RestApi restApi = RestApi.builder() + .addRoute(route("/test").get(ctx -> new MessageResponse(ctx.uriBuilder().toString()))) + .build(); + verifyJsonResponse(restApi, Method.GET, "/test", null, 200, "{\"message\":\"http://localhost\"}"); + } + private static void verifyJsonResponse(RestApi restApi, Method method, String path, String requestContent, int expectedStatusCode, String expectedJson) { - HttpRequest testRequest = requestContent != null ? - HttpRequest.createTestRequest( - path, method, - new ByteArrayInputStream(requestContent.getBytes(StandardCharsets.UTF_8)), - Map.of("Content-Type", "application/json")) : - HttpRequest.createTestRequest(path, method); + HttpRequest testRequest; + String uri = "http://localhost" + path; + if (requestContent != null) { + testRequest = HttpRequest.createTestRequest( + uri, method, + new ByteArrayInputStream(requestContent.getBytes(StandardCharsets.UTF_8)), + Map.of("Content-Type", "application/json")); + } else { + testRequest = HttpRequest.createTestRequest(uri, method); + } HttpResponse response = restApi.handleRequest(testRequest); assertEquals(expectedStatusCode, response.getStatus()); if (expectedJson != null) { |