From 59af0344a0daeb087a7647e1c6804bb1a73f3eee Mon Sep 17 00:00:00 2001 From: Clayton Walker Date: Tue, 11 May 2021 18:38:46 -0600 Subject: [PATCH 1/7] Add java16 unix socket support --- .../ApacheDockerHttpClientImpl.java | 3 +- .../dockerjava/transport/UnixSocket.java | 79 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index 174270f1e..6d49093b7 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -4,6 +4,7 @@ import com.github.dockerjava.transport.DomainSocket; import com.github.dockerjava.transport.NamedPipeSocket; import com.github.dockerjava.transport.SSLConfig; +import com.github.dockerjava.transport.UnixSocket; import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; @@ -120,7 +121,7 @@ private Registry createConnectionSocketFactoryRegistry( .register("unix", new PlainConnectionSocketFactory() { @Override public Socket createSocket(HttpContext context) throws IOException { - return DomainSocket.get(dockerHost.getPath()); + return UnixSocket.get(dockerHost.getPath()); } }) .register("npipe", new PlainConnectionSocketFactory() { diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java new file mode 100644 index 000000000..b9f915c1e --- /dev/null +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java @@ -0,0 +1,79 @@ +package com.github.dockerjava.transport; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.nio.channels.Channels; +import java.nio.channels.SocketChannel; + +public class UnixSocket extends AbstractSocket { + private final SocketAddress socketAddress; + private final SocketChannel socketChannel; + + public UnixSocket(SocketAddress address) throws IOException { + this.socketAddress = address; + this.socketChannel = SocketChannel.open(address); + } + + @Override + public InputStream getInputStream() throws IOException { + if (isClosed()) { + throw new SocketException("Socket is closed"); + } + if (!isConnected()) { + throw new SocketException("Socket is not connected"); + } + if (isInputShutdown()) { + throw new SocketException("Socket input is shutdown"); + } + + return Channels.newInputStream(socketChannel); + } + + @Override + public OutputStream getOutputStream() throws IOException { + if (isClosed()) { + throw new SocketException("Socket is closed"); + } + if (!isConnected()) { + throw new SocketException("Socket is not connected"); + } + if (isOutputShutdown()) { + throw new SocketException("Socket output is shutdown"); + } + + return Channels.newOutputStream(socketChannel); + } + + @Override + public SocketAddress getLocalSocketAddress() { + return socketAddress; + } + + @Override + public SocketAddress getRemoteSocketAddress() { + return socketAddress; + } + + @Override + public void close() throws IOException { + super.close(); + this.socketChannel.close(); + } + + public static Socket get(String dockerHost) throws IOException { + try { + Class unixDomainSocketAddress = unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); + SocketAddress address = + (SocketAddress) unixDomainSocketAddress.getMethod("of", String.class) + .invoke(null, dockerHost); + return new UnixSocket(address); + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + return DomainSocket.get(dockerHost); + } + } +} From 375a1774a07ba19eec75a953eff6ba9d56fed672 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Thu, 27 May 2021 22:03:44 +0200 Subject: [PATCH 2/7] Update docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java --- .../main/java/com/github/dockerjava/transport/UnixSocket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java index b9f915c1e..d46269f3c 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java @@ -67,7 +67,7 @@ public void close() throws IOException { public static Socket get(String dockerHost) throws IOException { try { - Class unixDomainSocketAddress = unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); + Class unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); SocketAddress address = (SocketAddress) unixDomainSocketAddress.getMethod("of", String.class) .invoke(null, dockerHost); From 86632164091ebb61571a84689cddb9bbecde8e4e Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Thu, 27 May 2021 22:10:20 +0200 Subject: [PATCH 3/7] Update ApacheDockerHttpClientImpl.java --- .../dockerjava/httpclient5/ApacheDockerHttpClientImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index 6d49093b7..6ae4ed650 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -1,7 +1,6 @@ package com.github.dockerjava.httpclient5; import com.github.dockerjava.transport.DockerHttpClient; -import com.github.dockerjava.transport.DomainSocket; import com.github.dockerjava.transport.NamedPipeSocket; import com.github.dockerjava.transport.SSLConfig; import com.github.dockerjava.transport.UnixSocket; From df1efc2e5881adac4d7a09b6bbc920efe6c47503 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Fri, 28 May 2021 15:25:17 +0200 Subject: [PATCH 4/7] Use UnixSocket in OkHttp as well --- .../java/com/github/dockerjava/okhttp/UnixSocketFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java index fd7499386..dc19b1351 100644 --- a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java +++ b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java @@ -1,6 +1,6 @@ package com.github.dockerjava.okhttp; -import com.github.dockerjava.transport.DomainSocket; +import com.github.dockerjava.transport.UnixSocket; import javax.net.SocketFactory; import java.io.IOException; @@ -18,7 +18,7 @@ class UnixSocketFactory extends SocketFactory { @Override public Socket createSocket() { try { - return DomainSocket.get(socketPath); + return UnixSocket.get(socketPath); } catch (IOException e) { throw new RuntimeException(e); } From ae783b230c0dc6215b2c46e442290aea9c5bf668 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Thu, 9 Sep 2021 10:23:48 +0200 Subject: [PATCH 5/7] Update UnixSocket.java --- .../dockerjava/transport/UnixSocket.java | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java index d46269f3c..a464504f2 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java @@ -11,12 +11,34 @@ import java.nio.channels.SocketChannel; public class UnixSocket extends AbstractSocket { + + /** + * Return a new {@link Socket} for the given path. Will use JDK's {@link java.net.UnixDomainSocketAddress} + * if available and fallback to {@link DomainSocket} otherwise. + * + * @param path the path to the domain socket + * @return a {@link Socket} instance + * @throws IOException if the socket cannot be opened + */ + public static Socket get(String path) throws IOException { + try { + return new UnixSocket(path); + } catch (Exception e) { + //noinspection deprecation + return DomainSocket.get(path); + } + } + private final SocketAddress socketAddress; + private final SocketChannel socketChannel; - public UnixSocket(SocketAddress address) throws IOException { - this.socketAddress = address; - this.socketChannel = SocketChannel.open(address); + private UnixSocket(String path) throws Exception { + Class unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); + this.socketAddress = + (SocketAddress) unixDomainSocketAddress.getMethod("of", String.class) + .invoke(null, path); + this.socketChannel = SocketChannel.open(this.socketAddress); } @Override @@ -64,16 +86,4 @@ public void close() throws IOException { super.close(); this.socketChannel.close(); } - - public static Socket get(String dockerHost) throws IOException { - try { - Class unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); - SocketAddress address = - (SocketAddress) unixDomainSocketAddress.getMethod("of", String.class) - .invoke(null, dockerHost); - return new UnixSocket(address); - } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - return DomainSocket.get(dockerHost); - } - } } From 6c1632736fecc10837eed386affeb4f14bf781da Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Thu, 9 Sep 2021 10:25:26 +0200 Subject: [PATCH 6/7] Update DomainSocket.java --- .../main/java/com/github/dockerjava/transport/DomainSocket.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/DomainSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/DomainSocket.java index ff77c3830..a2a3503f5 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/DomainSocket.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/DomainSocket.java @@ -130,7 +130,9 @@ public void close() throws IOException { * @param path the path to the domain socket * @return a {@link DomainSocket} instance * @throws IOException if the socket cannot be opened + * @deprecated use {@link UnixSocket#get(String)} */ + @Deprecated public static DomainSocket get(String path) throws IOException { if (Platform.isMac() || isBsdPlatform()) { return new BsdDomainSocket(path); From 245d2d930ddb4fd80ccd5e6c6e4cc41c4ee719b0 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Thu, 9 Sep 2021 10:28:41 +0200 Subject: [PATCH 7/7] Update UnixSocket.java --- .../main/java/com/github/dockerjava/transport/UnixSocket.java | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java index a464504f2..0a9338771 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.lang.reflect.InvocationTargetException; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException;