aboutsummaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorHÃ¥kon Hallingstad <hakon@verizonmedia.com>2021-04-13 13:29:28 +0200
committerGitHub <noreply@github.com>2021-04-13 13:29:28 +0200
commit9c56063bb3d68108d391aa6d8441d211b04ab38b (patch)
tree834d0c08b146ce49bac5057c8d6a9377817a8020 /container-core
parent73abec5c5354cbff70a4aa9a6fba78c5848b0b13 (diff)
parent32ee992e5cfc6f11a022cc62e658a6f2cf1d25a5 (diff)
Merge pull request #17385 from vespa-engine/bjorncs/rewrite-to-request-handler
Bjorncs/rewrite to request handler
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/ErrorResponse.java8
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApi.java1
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiException.java17
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java7
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiRequestHandler.java2
-rw-r--r--container-core/src/test/java/com/yahoo/restapi/RestApiImplTest.java24
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) {