Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/main/java/io/weaviate/client/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
}
}
18 changes: 18 additions & 0 deletions src/test/java/io/weaviate/client/ConfigTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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> 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> meta = client.misc().metaGetter().run();
// then
assertNotNull(meta);
assertNull(meta.getError());
assertEquals("http://[::]:8080", meta.getResult().getHostname());
}
}
25 changes: 25 additions & 0 deletions src/test/resources/docker-compose-proxy.yaml
Original file line number Diff line number Diff line change
@@ -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
...