diff options
-rw-r--r-- | configserver-client/src/main/java/ai/vespa/hosted/client/HttpConfigServerClient.java | 66 | ||||
-rw-r--r-- | http-client/OWNERS (renamed from configserver-client/OWNERS) | 0 | ||||
-rw-r--r-- | http-client/README.md (renamed from configserver-client/README.md) | 2 | ||||
-rw-r--r-- | http-client/pom.xml (renamed from configserver-client/pom.xml) | 22 | ||||
-rw-r--r-- | http-client/src/main/java/ai/vespa/hosted/client/AbstractConfigServerClient.java (renamed from configserver-client/src/main/java/ai/vespa/hosted/client/AbstractConfigServerClient.java) | 17 | ||||
-rw-r--r-- | http-client/src/main/java/ai/vespa/hosted/client/ConfigServerClient.java (renamed from configserver-client/src/main/java/ai/vespa/hosted/client/ConfigServerClient.java) | 0 | ||||
-rw-r--r-- | http-client/src/main/java/ai/vespa/hosted/client/ForwardingInputStream.java (renamed from configserver-client/src/main/java/ai/vespa/hosted/client/ForwardingInputStream.java) | 0 | ||||
-rw-r--r-- | http-client/src/main/java/ai/vespa/hosted/client/MockConfigServerClient.java (renamed from configserver-client/src/main/java/ai/vespa/hosted/client/MockConfigServerClient.java) | 0 | ||||
-rw-r--r-- | http-client/src/test/java/ai/vespa/hosted/client/HttpConfigServerClientTest.java (renamed from configserver-client/src/test/java/ai/vespa/hosted/client/HttpConfigServerClientTest.java) | 19 | ||||
-rw-r--r-- | http-client/src/test/java/ai/vespa/hosted/client/WireMockExtension.java (renamed from configserver-client/src/test/java/ai/vespa/hosted/client/WireMockExtension.java) | 0 | ||||
-rw-r--r-- | pom.xml | 2 |
11 files changed, 35 insertions, 93 deletions
diff --git a/configserver-client/src/main/java/ai/vespa/hosted/client/HttpConfigServerClient.java b/configserver-client/src/main/java/ai/vespa/hosted/client/HttpConfigServerClient.java deleted file mode 100644 index 6365e2b6b7d..00000000000 --- a/configserver-client/src/main/java/ai/vespa/hosted/client/HttpConfigServerClient.java +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package ai.vespa.hosted.client; - -import ai.vespa.util.http.hc5.VespaHttpClientBuilder; -import com.yahoo.vespa.athenz.api.AthenzIdentity; -import com.yahoo.vespa.athenz.tls.AthenzIdentityVerifier; -import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; -import org.apache.hc.client5.http.protocol.HttpClientContext; -import org.apache.hc.core5.http.ClassicHttpRequest; -import org.apache.hc.core5.http.ClassicHttpResponse; -import org.apache.hc.core5.http.io.SocketConfig; -import org.apache.hc.core5.util.TimeValue; -import org.apache.hc.core5.util.Timeout; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSession; -import java.io.IOException; -import java.util.Collection; -import java.util.Set; - -/** - * @author jonmv - */ -public class HttpConfigServerClient extends AbstractConfigServerClient { - - private final CloseableHttpClient client; - - public HttpConfigServerClient(Collection<AthenzIdentity> serverIdentities, String userAgent) { - if (serverIdentities.isEmpty()) - throw new IllegalArgumentException("At least one trusted server identity must be provided"); - - this.client = createClient(serverIdentities, userAgent); - } - - @Override - public void close() throws IOException { - client.close(); - } - - @Override - protected ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientContext context) throws IOException { - return client.execute(request, context); - } - - private static CloseableHttpClient createClient(Collection<AthenzIdentity> serverIdentities, String userAgent) { - return VespaHttpClientBuilder.create(socketFactories -> { - var manager = new PoolingHttpClientConnectionManager(socketFactories); - manager.setMaxTotal(1024); - manager.setDefaultMaxPerRoute(128); - manager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(Timeout.ofSeconds(5)).build()); - manager.setValidateAfterInactivity(TimeValue.ofSeconds(10)); - return manager; - }, - new AthenzIdentityVerifier(Set.copyOf(serverIdentities)) { - @Override public boolean verify(String hostname, SSLSession session) { - return super.verify(hostname, session) || "localhost".equals(hostname); - } - }, - false) - .disableAutomaticRetries() - .setUserAgent(userAgent) - .build(); - } - -} diff --git a/configserver-client/OWNERS b/http-client/OWNERS index d0a102ecbf4..d0a102ecbf4 100644 --- a/configserver-client/OWNERS +++ b/http-client/OWNERS diff --git a/configserver-client/README.md b/http-client/README.md index 7f124bbb3ec..a5912ecf2ef 100644 --- a/configserver-client/README.md +++ b/http-client/README.md @@ -1,2 +1,2 @@ <!-- Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -# HTTP client for configserver APIs, built on Apache http client 5 +# HTTP client wrapping on Apache http client 5 diff --git a/configserver-client/pom.xml b/http-client/pom.xml index 91ac43c72f6..a452353cb8a 100644 --- a/configserver-client/pom.xml +++ b/http-client/pom.xml @@ -11,8 +11,8 @@ <version>7-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> - <artifactId>configserver-client</artifactId> - <description>HTTP client for configserver APIs, built on Apache http client 5</description> + <artifactId>http-client</artifactId> + <description>HTTP client wrapper around an Apache http client 5</description> <dependencies> <dependency> @@ -24,30 +24,12 @@ <dependency> <groupId>com.yahoo.vespa</groupId> - <artifactId>vespa-athenz</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>com.yahoo.vespa</groupId> <artifactId>container-apache-http-client-bundle</artifactId> <version>${project.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.yahoo.vespa</groupId> - <artifactId>security-utils</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>com.yahoo.vespa</groupId> - <artifactId>config-provisioning</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>com.yahoo.vespa</groupId> <artifactId>vespajlib</artifactId> <version>${project.version}</version> <scope>provided</scope> diff --git a/configserver-client/src/main/java/ai/vespa/hosted/client/AbstractConfigServerClient.java b/http-client/src/main/java/ai/vespa/hosted/client/AbstractConfigServerClient.java index 3422d96e1d3..ec952c5c1ad 100644 --- a/configserver-client/src/main/java/ai/vespa/hosted/client/AbstractConfigServerClient.java +++ b/http-client/src/main/java/ai/vespa/hosted/client/AbstractConfigServerClient.java @@ -1,11 +1,11 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.hosted.client; -import ai.vespa.hosted.client.ConfigServerClient.RequestBuilder; import ai.vespa.http.HttpURL; import ai.vespa.http.HttpURL.Path; import ai.vespa.http.HttpURL.Query; import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.protocol.HttpClientContext; import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.ClassicHttpResponse; @@ -38,8 +38,21 @@ public abstract class AbstractConfigServerClient implements ConfigServerClient { private static final Logger log = Logger.getLogger(AbstractConfigServerClient.class.getName()); + public static ConfigServerClient wrapping(CloseableHttpClient client) { + return new AbstractConfigServerClient() { + @Override + protected ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientContext context) throws IOException { + return client.execute(request, context); + } + @Override + public void close() throws IOException { + client.close(); + } + }; + } + /** Executes the request with the given context. The caller must close the response. */ - abstract ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientContext context) throws IOException; + protected abstract ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientContext context) throws IOException; /** Executes the given request with response/error handling and retries. */ private <T> T execute(RequestBuilder builder, diff --git a/configserver-client/src/main/java/ai/vespa/hosted/client/ConfigServerClient.java b/http-client/src/main/java/ai/vespa/hosted/client/ConfigServerClient.java index 47e062766c6..47e062766c6 100644 --- a/configserver-client/src/main/java/ai/vespa/hosted/client/ConfigServerClient.java +++ b/http-client/src/main/java/ai/vespa/hosted/client/ConfigServerClient.java diff --git a/configserver-client/src/main/java/ai/vespa/hosted/client/ForwardingInputStream.java b/http-client/src/main/java/ai/vespa/hosted/client/ForwardingInputStream.java index 402c2689ca7..402c2689ca7 100644 --- a/configserver-client/src/main/java/ai/vespa/hosted/client/ForwardingInputStream.java +++ b/http-client/src/main/java/ai/vespa/hosted/client/ForwardingInputStream.java diff --git a/configserver-client/src/main/java/ai/vespa/hosted/client/MockConfigServerClient.java b/http-client/src/main/java/ai/vespa/hosted/client/MockConfigServerClient.java index 16aad80670b..16aad80670b 100644 --- a/configserver-client/src/main/java/ai/vespa/hosted/client/MockConfigServerClient.java +++ b/http-client/src/main/java/ai/vespa/hosted/client/MockConfigServerClient.java diff --git a/configserver-client/src/test/java/ai/vespa/hosted/client/HttpConfigServerClientTest.java b/http-client/src/test/java/ai/vespa/hosted/client/HttpConfigServerClientTest.java index e969201605e..1bb352568bc 100644 --- a/configserver-client/src/test/java/ai/vespa/hosted/client/HttpConfigServerClientTest.java +++ b/http-client/src/test/java/ai/vespa/hosted/client/HttpConfigServerClientTest.java @@ -1,14 +1,17 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.hosted.client; -import ai.vespa.hosted.client.ConfigServerClient.ResponseException; import ai.vespa.hosted.client.ConfigServerClient.HostStrategy; +import ai.vespa.hosted.client.ConfigServerClient.ResponseException; import com.github.tomakehurst.wiremock.http.Fault; -import com.yahoo.vespa.athenz.api.AthenzService; +import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.core5.http.Method; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import java.io.IOException; import java.io.UncheckedIOException; import java.net.URI; import java.util.List; @@ -35,7 +38,12 @@ class HttpConfigServerClientTest { @RegisterExtension final WireMockExtension server = new WireMockExtension(); - final ConfigServerClient client = new HttpConfigServerClient(List.of(new AthenzService("mydomain", "yourservice")), "user"); + ConfigServerClient client; + + @BeforeEach + void setup() { + client = AbstractConfigServerClient.wrapping(HttpClients.createMinimal()); + } @Test void testRetries() { @@ -95,4 +103,9 @@ class HttpConfigServerClientTest { server.resetRequests(); } + @AfterEach + void teardown() throws IOException { + client.close(); + } + } diff --git a/configserver-client/src/test/java/ai/vespa/hosted/client/WireMockExtension.java b/http-client/src/test/java/ai/vespa/hosted/client/WireMockExtension.java index d95650727c0..d95650727c0 100644 --- a/configserver-client/src/test/java/ai/vespa/hosted/client/WireMockExtension.java +++ b/http-client/src/test/java/ai/vespa/hosted/client/WireMockExtension.java @@ -49,7 +49,6 @@ <module>config-provisioning</module> <module>config-proxy</module> <module>configserver</module> - <module>configserver-client</module> <module>configserver-flags</module> <module>config_test</module> <module>container</module> @@ -83,6 +82,7 @@ <module>hosted-api</module> <module>hosted-tenant-base</module> <module>hosted-zone-api</module> + <module>http-client</module> <module>http-utils</module> <module>indexinglanguage</module> <!--<module>integration/intellij</module>--> |