diff options
Diffstat (limited to 'hosted-api/src')
3 files changed, 35 insertions, 89 deletions
diff --git a/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java b/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java index c7ca19612d9..7710f3c6129 100644 --- a/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java +++ b/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java @@ -66,14 +66,25 @@ public abstract class ControllerHttpClient { .timeout(Duration.ofMinutes(30)), POST, new MultiPartStreamer().addJson("submitOptions", metaToJson(submission)) - .addFile("applicationZip", submission.applicationZip()) - .addFile("applicationTestZip", submission.applicationTestZip())))); + .addFile("applicationZip", submission.applicationZip()) + .addFile("applicationTestZip", submission.applicationTestZip())))); } - protected abstract HttpRequest request(HttpRequest.Builder request, Method method); - protected abstract HttpRequest request(HttpRequest.Builder request, Method method, byte[] data); - protected abstract HttpRequest request(HttpRequest.Builder request, Method method, Supplier<InputStream> data); - protected abstract HttpRequest request(HttpRequest.Builder request, Method method, MultiPartStreamer data); + protected HttpRequest request(HttpRequest.Builder request, Method method, Supplier<InputStream> data) { + return request.method(method.name(), ofInputStream(data)).build(); + } + + private HttpRequest request(HttpRequest.Builder request, Method method) { + return request(request, method, InputStream::nullInputStream); + } + + private HttpRequest request(HttpRequest.Builder request, Method method, byte[] data) { + return request(request, method, () -> new ByteArrayInputStream(data)); + } + + private HttpRequest request(HttpRequest.Builder request, Method method, MultiPartStreamer data) { + return request(request.setHeader("Content-Type", data.contentType()), method, data::data); + } private URI apiPath() { return concatenated(endpoint, "application", "v4"); @@ -95,6 +106,19 @@ public abstract class ControllerHttpClient { return base.resolve(String.join("/", parts) + "/"); } + private HttpResponse<byte[]> send(HttpRequest request) { + return unchecked(() -> client.send(request, ofByteArray())); + } + + private static <T> T unchecked(Callable<T> callable) { + try { + return callable.call(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + /** Returns a JSON representation of the submission meta data. */ private static String metaToJson(Submission submission) { try { @@ -130,19 +154,6 @@ public abstract class ControllerHttpClient { return new JsonDecoder().decode(new Slime(), data); } - private HttpResponse<byte[]> send(HttpRequest request) { - return unchecked(() -> client.send(request, ofByteArray())); - } - - private static <T> T unchecked(Callable<T> callable) { - try { - return callable.call(); - } - catch (Exception e) { - throw new RuntimeException(e); - } - } - /** Client that signs requests with a private key whose public part is assigned to an application in the remote controller. */ private static class SigningControllerHttpClient extends ControllerHttpClient { @@ -155,25 +166,10 @@ public abstract class ControllerHttpClient { } @Override - protected HttpRequest request(HttpRequest.Builder request, Method method) { - return signer.signed(request, method); - } - - @Override - protected HttpRequest request(HttpRequest.Builder request, Method method, byte[] data) { - return signer.signed(request, method, data); - } - - @Override protected HttpRequest request(HttpRequest.Builder request, Method method, Supplier<InputStream> data) { return signer.signed(request, method, data); } - @Override - protected HttpRequest request(HttpRequest.Builder request, Method method, MultiPartStreamer data) { - return signer.signed(request, method, data); - } - } @@ -181,28 +177,8 @@ public abstract class ControllerHttpClient { private static class AthenzControllerHttpClient extends ControllerHttpClient { private AthenzControllerHttpClient(URI endpoint, Path privateKeyFile, Path certificateFile) { - super(endpoint, HttpClient.newBuilder() - .sslContext(new SslContextBuilder().withKeyStore(privateKeyFile, certificateFile).build())); - } - - @Override - protected HttpRequest request(HttpRequest.Builder request, Method method) { - return request(request, method, InputStream::nullInputStream); - } - - @Override - protected HttpRequest request(HttpRequest.Builder request, Method method, byte[] data) { - return request(request, method, () -> new ByteArrayInputStream(data)); - } - - @Override - protected HttpRequest request(HttpRequest.Builder request, Method method, Supplier<InputStream> data) { - return request.method(method.name(), ofInputStream(data)).build(); - } - - @Override - protected HttpRequest request(HttpRequest.Builder request, Method method, MultiPartStreamer data) { - return request(request.header("Content-Type", data.contentType()), method, data::data); + super(endpoint, + HttpClient.newBuilder().sslContext(new SslContextBuilder().withKeyStore(privateKeyFile, certificateFile).build())); } } diff --git a/hosted-api/src/main/java/ai/vespa/hosted/api/RequestSigner.java b/hosted-api/src/main/java/ai/vespa/hosted/api/RequestSigner.java index 5bbb0bb76cc..b2fd16b7975 100644 --- a/hosted-api/src/main/java/ai/vespa/hosted/api/RequestSigner.java +++ b/hosted-api/src/main/java/ai/vespa/hosted/api/RequestSigner.java @@ -70,35 +70,4 @@ public class RequestSigner { } } - /** - * Completes, signs and returns the given request builder and data. - * - * This sets the Content-Type header from the given streamer, and returns - * {@code signed(request, method, streamer::data)}. - */ - public HttpRequest signed(HttpRequest.Builder request, Method method, MultiPartStreamer streamer) { - request.setHeader("Content-Type", streamer.contentType()); - return signed(request, method, streamer::data); - } - - /** - * Completes, signs and returns the given request builder.<br> - * <br> - * This is simply a convenience for<br> - * {@code signed(request, method, () -> new ByteArrayInputStream(data))}. - */ - public HttpRequest signed(HttpRequest.Builder request, Method method, byte[] data) { - return signed(request, method, () -> new ByteArrayInputStream(data)); - } - - /** - * Completes, signs and returns the given request builder.<br> - * <br> - * This sets the data of the request to be empty, and returns <br> - * {@code signed(request, method, InputStream::nullInputStream)}. - */ - public HttpRequest signed(HttpRequest.Builder request, Method method) { - return signed(request, method, InputStream::nullInputStream); - } - } diff --git a/hosted-api/src/test/java/ai/vespa/hosted/api/SignaturesTest.java b/hosted-api/src/test/java/ai/vespa/hosted/api/SignaturesTest.java index 9be32812514..0a0d4a48edf 100644 --- a/hosted-api/src/test/java/ai/vespa/hosted/api/SignaturesTest.java +++ b/hosted-api/src/test/java/ai/vespa/hosted/api/SignaturesTest.java @@ -4,6 +4,7 @@ package ai.vespa.hosted.api; import org.junit.Test; import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.net.URI; import java.net.http.HttpRequest; import java.security.DigestInputStream; @@ -75,7 +76,7 @@ public class SignaturesTest { URI requestUri = URI.create("https://host:123/path//./../more%2fpath/?yes=no"); HttpRequest.Builder builder = HttpRequest.newBuilder(requestUri); - HttpRequest request = signer.signed(builder, Method.GET); + HttpRequest request = signer.signed(builder, Method.GET, InputStream::nullInputStream); // GET request with correct signature and URI as-is. RequestVerifier verifier = new RequestVerifier(ecPemPublicKey, clock); @@ -88,7 +89,7 @@ public class SignaturesTest { // POST request with correct signature and URI normalized. MultiPartStreamer streamer = new MultiPartStreamer().addText("message", new String(message, UTF_8)) .addBytes("copy", message); - request = signer.signed(builder, Method.POST, streamer); + request = signer.signed(builder.setHeader("Content-Type", streamer.contentType()), Method.POST, streamer::data); assertTrue(verifier.verify(Method.valueOf(request.method()), request.uri().normalize(), request.headers().firstValue("X-Timestamp").get(), |