Skip to content

Commit d44a7a1

Browse files
authored
Support path of DOCKER_HOST (#1801)
* Support path of DOCKER_HOST * use a more advanced path * Fix path-less scenario in `OkDockerHttpClient`
1 parent e100e25 commit d44a7a1

File tree

11 files changed

+195
-1
lines changed

11 files changed

+195
-1
lines changed

docker-java-transport-httpclient5/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@
3939
<artifactId>jna</artifactId>
4040
<version>5.8.0</version>
4141
</dependency>
42+
43+
<dependency>
44+
<groupId>${project.groupId}</groupId>
45+
<artifactId>docker-java-transport-tck</artifactId>
46+
<version>${project.version}</version>
47+
<scope>test</scope>
48+
</dependency>
4249
</dependencies>
4350

4451
<build>

docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class ApacheDockerHttpClientImpl implements DockerHttpClient {
5151

5252
private final CloseableHttpClient httpClient;
5353
private final HttpHost host;
54+
private final String pathPrefix;
5455

5556
protected ApacheDockerHttpClientImpl(
5657
URI dockerHost,
@@ -64,16 +65,22 @@ protected ApacheDockerHttpClientImpl(
6465
switch (dockerHost.getScheme()) {
6566
case "unix":
6667
case "npipe":
68+
pathPrefix = "";
6769
host = new HttpHost(dockerHost.getScheme(), "localhost", 2375);
6870
break;
6971
case "tcp":
72+
String rawPath = dockerHost.getRawPath();
73+
pathPrefix = rawPath.endsWith("/")
74+
? rawPath.substring(0, rawPath.length() - 1)
75+
: rawPath;
7076
host = new HttpHost(
7177
socketFactoryRegistry.lookup("https") != null ? "https" : "http",
7278
dockerHost.getHost(),
7379
dockerHost.getPort()
7480
);
7581
break;
7682
default:
83+
pathPrefix = "";
7784
host = HttpHost.create(dockerHost);
7885
}
7986

@@ -159,7 +166,7 @@ public Socket createSocket(HttpContext context) {
159166
@Override
160167
public Response execute(Request request) {
161168
HttpContext context = new BasicHttpContext();
162-
HttpUriRequestBase httpUriRequest = new HttpUriRequestBase(request.method(), URI.create(request.path()));
169+
HttpUriRequestBase httpUriRequest = new HttpUriRequestBase(request.method(), URI.create(pathPrefix + request.path()));
163170
httpUriRequest.setScheme(host.getSchemeName());
164171
httpUriRequest.setAuthority(new URIAuthority(host.getHostName(), host.getPort()));
165172

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.dockerjava.transport;
2+
3+
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
4+
5+
import java.net.URI;
6+
7+
public class HttpClient5Tests extends DockerHttpClientTCK {
8+
9+
@Override
10+
protected DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig) {
11+
return new ApacheDockerHttpClient.Builder()
12+
.dockerHost(dockerHost)
13+
.sslConfig(sslConfig)
14+
.build();
15+
}
16+
}

docker-java-transport-jersey/pom.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,20 @@
6868
<artifactId>junixsocket-native-common</artifactId>
6969
<version>${junixsocket.version}</version>
7070
</dependency>
71+
72+
<dependency>
73+
<groupId>org.slf4j</groupId>
74+
<artifactId>jcl-over-slf4j</artifactId>
75+
<version>1.7.30</version>
76+
<scope>test</scope>
77+
</dependency>
78+
79+
<dependency>
80+
<groupId>${project.groupId}</groupId>
81+
<artifactId>docker-java-transport-tck</artifactId>
82+
<version>${project.version}</version>
83+
<scope>test</scope>
84+
</dependency>
7185
</dependencies>
7286

7387
<build>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.dockerjava.transport;
2+
3+
import com.github.dockerjava.jaxrs.JerseyDockerHttpClient;
4+
5+
import java.net.URI;
6+
7+
public class JerseyTests extends DockerHttpClientTCK {
8+
9+
@Override
10+
protected DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig) {
11+
return new JerseyDockerHttpClient.Builder()
12+
.dockerHost(dockerHost)
13+
.sslConfig(sslConfig)
14+
.connectTimeout(30 * 1000)
15+
.build();
16+
}
17+
}

docker-java-transport-okhttp/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@
3333
<artifactId>jna-platform</artifactId>
3434
<version>5.8.0</version>
3535
</dependency>
36+
37+
<dependency>
38+
<groupId>${project.groupId}</groupId>
39+
<artifactId>docker-java-transport-tck</artifactId>
40+
<version>${project.version}</version>
41+
<scope>test</scope>
42+
</dependency>
3643
</dependencies>
3744

3845
<build>

docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ private OkDockerHttpClient(
169169
.scheme(isSSL ? "https" : "http")
170170
.host(dockerHost.getHost())
171171
.port(dockerHost.getPort());
172+
173+
if (dockerHost.getPath().length() > 0) {
174+
baseUrlBuilder = baseUrlBuilder.encodedPath(dockerHost.getPath());
175+
}
172176
break;
173177
default:
174178
baseUrlBuilder = HttpUrl.get(dockerHost.toString()).newBuilder();
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.dockerjava.transport;
2+
3+
import com.github.dockerjava.okhttp.OkDockerHttpClient;
4+
5+
import java.net.URI;
6+
7+
public class OkHttpClientTests extends DockerHttpClientTCK {
8+
9+
@Override
10+
protected DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig) {
11+
return new OkDockerHttpClient.Builder()
12+
.dockerHost(dockerHost)
13+
.sslConfig(sslConfig)
14+
.connectTimeout(30 * 100)
15+
.build();
16+
}
17+
}

docker-java-transport-tck/pom.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<modelVersion>4.0.0</modelVersion>
3+
4+
<parent>
5+
<groupId>com.github.docker-java</groupId>
6+
<artifactId>docker-java-parent</artifactId>
7+
<version>0-SNAPSHOT</version>
8+
<relativePath>../pom.xml</relativePath>
9+
</parent>
10+
11+
<artifactId>docker-java-transport-tck</artifactId>
12+
<packaging>jar</packaging>
13+
14+
<name>docker-java-transport-tck</name>
15+
<url>https://github.com/docker-java/docker-java</url>
16+
<description>Java API Client for Docker</description>
17+
18+
<dependencies>
19+
<dependency>
20+
<groupId>${project.groupId}</groupId>
21+
<artifactId>docker-java-transport</artifactId>
22+
<version>${project.version}</version>
23+
</dependency>
24+
25+
<dependency>
26+
<groupId>org.assertj</groupId>
27+
<artifactId>assertj-core</artifactId>
28+
<version>3.22.0</version>
29+
</dependency>
30+
31+
<dependency>
32+
<groupId>com.squareup.okhttp3</groupId>
33+
<artifactId>mockwebserver</artifactId>
34+
<version>3.14.9</version>
35+
</dependency>
36+
</dependencies>
37+
38+
<build>
39+
<plugins>
40+
<plugin>
41+
<groupId>org.apache.maven.plugins</groupId>
42+
<artifactId>maven-deploy-plugin</artifactId>
43+
<configuration>
44+
<skip>true</skip>
45+
</configuration>
46+
</plugin>
47+
</plugins>
48+
</build>
49+
</project>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.github.dockerjava.transport;
2+
3+
import com.github.dockerjava.transport.DockerHttpClient.Request;
4+
import com.github.dockerjava.transport.DockerHttpClient.Request.Method;
5+
import com.github.dockerjava.transport.DockerHttpClient.Response;
6+
import okhttp3.mockwebserver.MockResponse;
7+
import okhttp3.mockwebserver.MockWebServer;
8+
import org.junit.Test;
9+
10+
import java.net.URI;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
14+
public abstract class DockerHttpClientTCK {
15+
16+
protected abstract DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig);
17+
18+
/**
19+
* Test that docker-java supports path in DOCKER_HOST
20+
*
21+
* @see <a href="https://github.com/moby/moby/blob/7b9275c0da707b030e62c96b679a976f31f929d3/opts/hosts_test.go#L64">valid values</a>
22+
*/
23+
@Test
24+
public final void testPath() throws Exception {
25+
try (MockWebServer server = new MockWebServer()) {
26+
String dockerHost = server.url("/%20some/path/").toString()
27+
.replace("http://", "tcp://");
28+
29+
try (DockerHttpClient client = createDockerHttpClient(dockerHost)) {
30+
server.enqueue(new MockResponse().setResponseCode(200));
31+
ping(client);
32+
assertThat(server.takeRequest().getPath())
33+
.as("recorded path")
34+
.isEqualTo("/%20some/path/_ping");
35+
}
36+
}
37+
}
38+
39+
private DockerHttpClient createDockerHttpClient(String dockerHost) {
40+
return createDockerHttpClient(URI.create(dockerHost), null);
41+
}
42+
43+
private void ping(DockerHttpClient client) {
44+
Request pingRequest = Request.builder()
45+
.method(Method.GET)
46+
.path("/_ping")
47+
.build();
48+
49+
try (Response response = client.execute(pingRequest)) {
50+
assertThat(response.getStatusCode())
51+
.as("status code")
52+
.isEqualTo(200);
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)