Skip to content

[DE-930] HTTP proxy support #584

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Oct 31, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
HTTP proxy configuration
  • Loading branch information
rashtao committed Oct 31, 2024
commit b304b85c327b5c26977b1973ccf6f339957d2c8c
3 changes: 3 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ jobs:
docker-img: <<parameters.docker-img>>
topology: <<parameters.topology>>
ssl: <<parameters.ssl>>
- run:
name: Start proxy
command: ./docker/start_proxy.sh
- load_cache
- run:
name: mvn dependency:tree
Expand Down
3 changes: 3 additions & 0 deletions docker/start_proxy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

docker run -d -e LOG_LEVEL=Info -e AUTH_USER=user -e AUTH_PASSWORD=password -p 8888:8888 docker.io/kalaksi/tinyproxy:1.7
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ private static String getUserAgent() {
return "JavaDriver/" + PackageVersion.VERSION + " (JVM/" + System.getProperty("java.specification.version") + ")";
}

HttpConnection(final ArangoConfig config, final HostDescription host, final Vertx existingVertx) {
HttpConnection(final ArangoConfig config, final HostDescription host, final HttpProtocolConfig protocolConfig) {
super();
Protocol protocol = config.getProtocol();
ContentType contentType = ContentTypeFactory.of(protocol);
Expand All @@ -113,9 +113,9 @@ private static String getUserAgent() {
).toHttpAuthorization();

Vertx vertxToUse;
if (existingVertx != null) {
if (protocolConfig.getVertx() != null) {
// reuse existing Vert.x
vertxToUse = existingVertx;
vertxToUse = protocolConfig.getVertx();
// Vert.x will not be closed when connection is closed
vertxToClose = null;
LOGGER.debug("Reusing existing Vert.x instance");
Expand Down Expand Up @@ -154,7 +154,8 @@ private static String getUserAgent() {
.setHttp2ClearTextUpgrade(false)
.setProtocolVersion(httpVersion)
.setDefaultHost(host.getHost())
.setDefaultPort(host.getPort());
.setDefaultPort(host.getPort())
.setProxyOptions(protocolConfig.getProxyOptions());

if (compression != Compression.NONE) {
webClientOptions.setTryUseCompression(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,11 @@
public class HttpConnectionFactory implements ConnectionFactory {
private final Logger LOGGER = LoggerFactory.getLogger(HttpConnectionFactory.class);

private final Vertx vertx;
final HttpProtocolConfig protocolConfig;

public HttpConnectionFactory(@UnstableApi final HttpProtocolConfig config) {
HttpProtocolConfig cfg = config != null ? config : HttpProtocolConfig.builder().build();
vertx = cfg.getVertx();
if (vertx == null && !PackageVersion.SHADED && Vertx.currentContext() != null) {
public HttpConnectionFactory(@UnstableApi final HttpProtocolConfig cfg) {
protocolConfig = cfg != null ? cfg : HttpProtocolConfig.builder().build();
if (protocolConfig.getVertx() == null && !PackageVersion.SHADED && Vertx.currentContext() != null) {
LOGGER.warn("Found an existing Vert.x instance, you can reuse it by setting:\n" +
"new ArangoDB.Builder()\n" +
" // ...\n" +
Expand All @@ -51,6 +50,6 @@ public HttpConnectionFactory(@UnstableApi final HttpProtocolConfig config) {
@Override
@UnstableApi
public Connection create(@UnstableApi final ArangoConfig config, final HostDescription host) {
return new HttpConnection(config, host, vertx);
return new HttpConnection(config, host, protocolConfig);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@

import com.arangodb.config.ProtocolConfig;
import io.vertx.core.Vertx;
import io.vertx.core.net.ProxyOptions;

public final class HttpProtocolConfig implements ProtocolConfig {
private final Vertx vertx;
private final ProxyOptions proxyOptions;

public static Builder builder() {
return new Builder();
}

public static class Builder {
private Vertx vertx;
private ProxyOptions proxyOptions;

private Builder() {
}
Expand All @@ -27,16 +30,30 @@ public Builder vertx(Vertx vertx) {
return this;
}

/**
* @param proxyOptions proxy options for HTTP connections
* @return this builder
*/
public Builder proxyOptions(ProxyOptions proxyOptions) {
this.proxyOptions = proxyOptions;
return this;
}

public HttpProtocolConfig build() {
return new HttpProtocolConfig(vertx);
return new HttpProtocolConfig(vertx, proxyOptions);
}
}

private HttpProtocolConfig(Vertx vertx) {
private HttpProtocolConfig(Vertx vertx, ProxyOptions proxyOptions) {
this.vertx = vertx;
this.proxyOptions = proxyOptions;
}

public Vertx getVertx() {
return vertx;
}

public ProxyOptions getProxyOptions() {
return proxyOptions;
}
}
28 changes: 28 additions & 0 deletions test-functional/src/test-ssl/java/com/arangodb/ArangoSslTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
package com.arangodb;

import com.arangodb.entity.ArangoDBVersion;
import com.arangodb.http.HttpProtocolConfig;
import io.vertx.core.net.ProxyOptions;
import io.vertx.core.net.ProxyType;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;

Expand All @@ -38,6 +41,31 @@
*/
class ArangoSslTest extends BaseTest {

@ParameterizedTest
@EnumSource(Protocol.class)
void httpProxy(Protocol protocol) {
assumeTrue(protocol != Protocol.VST);

final ArangoDB arangoDB = new ArangoDB.Builder()
.protocol(protocol)
.host("172.28.0.1", 8529)
.password("test")
.useSsl(true)
.sslContext(createSslContext())
.verifyHost(false)
.protocolConfig(HttpProtocolConfig.builder()
.proxyOptions(new ProxyOptions()
.setType(ProxyType.HTTP)
.setHost("127.0.0.1")
.setPort(8888)
.setUsername("user")
.setPassword("password"))
.build())
.build();
final ArangoDBVersion version = arangoDB.getVersion();
assertThat(version).isNotNull();
}

@ParameterizedTest
@EnumSource(Protocol.class)
void connect(Protocol protocol) {
Expand Down