diff --git a/src/main/java/io/weaviate/client/Config.java b/src/main/java/io/weaviate/client/Config.java index f236b7e2a..8dbc9189c 100644 --- a/src/main/java/io/weaviate/client/Config.java +++ b/src/main/java/io/weaviate/client/Config.java @@ -12,6 +12,10 @@ public class Config { private final int connectionTimeout; private final int connectionRequestTimeout; private final int socketTimeout; + private String proxyHost; + private int proxyPort; + private String proxyScheme; + public Config(String scheme, String host) { this(scheme, host, null, DEFAULT_TIMEOUT_SECONDS, DEFAULT_TIMEOUT_SECONDS, DEFAULT_TIMEOUT_SECONDS); @@ -50,4 +54,23 @@ public int getConnectionRequestTimeout() { public int getSocketTimeout() { return socketTimeout; } + + public void setProxy(String proxyHost, int proxyPort, String proxyScheme) { + this.proxyHost = proxyHost; + this.proxyPort = proxyPort; + this.proxyScheme = proxyScheme; + } + + public String getProxyHost() { + return proxyHost; + } + + public int getProxyPort() { + return proxyPort; + } + + public String getProxyScheme() { + return proxyScheme; + } + } diff --git a/src/main/java/io/weaviate/client/base/http/builder/HttpApacheClientBuilder.java b/src/main/java/io/weaviate/client/base/http/builder/HttpApacheClientBuilder.java index 9e6295c1a..8d2e4bde4 100644 --- a/src/main/java/io/weaviate/client/base/http/builder/HttpApacheClientBuilder.java +++ b/src/main/java/io/weaviate/client/base/http/builder/HttpApacheClientBuilder.java @@ -1,5 +1,6 @@ package io.weaviate.client.base.http.builder; +import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import io.weaviate.client.Config; @@ -10,10 +11,16 @@ public class HttpApacheClientBuilder { private HttpApacheClientBuilder() {} public static CommonsHttpClientImpl.CloseableHttpClientBuilder build(Config config) { - RequestConfig requestConfig = RequestConfig.custom() + RequestConfig.Builder requestConfigBuilder = RequestConfig.custom() .setConnectTimeout(config.getConnectionTimeout() * 1000) .setConnectionRequestTimeout(config.getConnectionRequestTimeout() * 1000) - .setSocketTimeout(config.getSocketTimeout() * 1000).build(); + .setSocketTimeout(config.getSocketTimeout() * 1000); + + if (config.getProxyHost() != null) { + requestConfigBuilder.setProxy(new HttpHost(config.getProxyHost(), config.getProxyPort(), config.getProxyScheme())); + } + + RequestConfig requestConfig = requestConfigBuilder.build(); return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)::build; } } diff --git a/src/test/java/io/weaviate/client/ConfigTest.java b/src/test/java/io/weaviate/client/ConfigTest.java index e0f6c5aa8..7d2a615cc 100644 --- a/src/test/java/io/weaviate/client/ConfigTest.java +++ b/src/test/java/io/weaviate/client/ConfigTest.java @@ -32,4 +32,22 @@ public void testConfigHeaders() { Assert.assertEquals("https://localhost:8080/v1", config.getBaseURL()); Assert.assertEquals(1, config.getHeaders().size()); } + + @Test + public void testConfigProxy() { + // given + String scheme = "https"; + String domain = "localhost:8080"; + String proxyHost = "proxy"; + int proxyPort = 8080; + String proxyScheme = "http"; + // when + Config config = new Config(scheme, domain); + config.setProxy(proxyHost, proxyPort, proxyScheme); + // then + Assert.assertEquals("https://localhost:8080/v1", config.getBaseURL()); + Assert.assertEquals("proxy", config.getProxyHost()); + Assert.assertEquals(8080, config.getProxyPort()); + Assert.assertEquals("http", config.getProxyScheme()); + } } diff --git a/src/test/java/io/weaviate/integration/client/proxy/ClientProxyTest.java b/src/test/java/io/weaviate/integration/client/proxy/ClientProxyTest.java new file mode 100644 index 000000000..8a80db929 --- /dev/null +++ b/src/test/java/io/weaviate/integration/client/proxy/ClientProxyTest.java @@ -0,0 +1,60 @@ +package io.weaviate.integration.client.proxy; + +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import io.weaviate.client.Config; +import io.weaviate.client.WeaviateClient; +import io.weaviate.client.base.Result; +import io.weaviate.client.v1.misc.model.Meta; + +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static io.weaviate.integration.client.WeaviateVersion.EXPECTED_WEAVIATE_VERSION; + +public class ClientProxyTest { + + private WeaviateClient client; + + @ClassRule + public static DockerComposeContainer compose = new DockerComposeContainer<>( + new File("src/test/resources/docker-compose-proxy.yaml") + ).withExposedService("weaviate_1", 8080, Wait.forHttp("/v1/.well-known/ready").forStatusCode(200) + ).withExposedService("proxy_1", 80, Wait.forHttp("/").forStatusCode(503)); + + @Test + public void testProxyUnset() { + Config config = new Config("http", "weaviate.local"); + + client = new WeaviateClient(config); + // when + Result meta = client.misc().metaGetter().run(); + // then + assertNotNull(meta); + assertNotNull(meta.getError()); + } + + @Test + public void testProxySet() { + String proxyHost = compose.getServiceHost("proxy_1", 80); + Integer port = compose.getServicePort("proxy_1", 80); + String proxyScheme = "http"; + + Config config = new Config("http", "weaviate.local"); + config.setProxy(proxyHost, port, proxyScheme); + + client = new WeaviateClient(config); + // when + Result meta = client.misc().metaGetter().run(); + // then + assertNotNull(meta); + assertNull(meta.getError()); + assertEquals("http://[::]:8080", meta.getResult().getHostname()); + } +} diff --git a/src/test/resources/docker-compose-proxy.yaml b/src/test/resources/docker-compose-proxy.yaml new file mode 100644 index 000000000..cbe6dc620 --- /dev/null +++ b/src/test/resources/docker-compose-proxy.yaml @@ -0,0 +1,25 @@ +--- +version: '3.4' +services: + weaviate: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: semitechnologies/weaviate:1.21.0 + restart: on-failure:0 + environment: + LOG_LEVEL: "debug" + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: "./data" + VIRTUAL_HOST: weaviate.local + VIRTUAL_PORT: 8080 + proxy: + image: nginxproxy/nginx-proxy:alpine + volumes: + - /var/run/docker.sock:/tmp/docker.sock:ro +...