From f18b657ff9c4cbd7e6f820c0102b4139b6e60160 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 10 Jul 2020 15:31:55 +0100 Subject: [PATCH] Fix handling of DOCKER_HOST that begins with unix:// Fixes gh-22300 --- .../docker/transport/LocalHttpClientTransport.java | 10 +++++++++- .../docker/transport/RemoteHttpClientTransport.java | 5 ++++- .../platform/docker/transport/HttpTransportTests.java | 9 +++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/LocalHttpClientTransport.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/LocalHttpClientTransport.java index 8182cb31aec5..fbe3914528d1 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/LocalHttpClientTransport.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/LocalHttpClientTransport.java @@ -50,6 +50,8 @@ */ final class LocalHttpClientTransport extends HttpClientTransport { + private static final String UNIX_SOCKET_PREFIX = "unix://"; + private static final String DOCKER_HOST = "DOCKER_HOST"; private static final HttpHost LOCAL_DOCKER_HOST = HttpHost.create("docker://localhost"); @@ -60,11 +62,17 @@ private LocalHttpClientTransport(CloseableHttpClient client) { static LocalHttpClientTransport create(Environment environment) { HttpClientBuilder builder = HttpClients.custom(); - builder.setConnectionManager(new LocalConnectionManager(environment.get(DOCKER_HOST))); + builder.setConnectionManager(new LocalConnectionManager(socketFilePath(environment))); builder.setSchemePortResolver(new LocalSchemePortResolver()); return new LocalHttpClientTransport(builder.build()); } + private static String socketFilePath(Environment environment) { + String host = environment.get(DOCKER_HOST); + return (host != null && host.startsWith(UNIX_SOCKET_PREFIX)) ? host.substring(UNIX_SOCKET_PREFIX.length()) + : host; + } + /** * {@link HttpClientConnectionManager} for local Docker. */ diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/RemoteHttpClientTransport.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/RemoteHttpClientTransport.java index a2494281971a..1b4df90b38ec 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/RemoteHttpClientTransport.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/RemoteHttpClientTransport.java @@ -40,6 +40,8 @@ */ final class RemoteHttpClientTransport extends HttpClientTransport { + private static final String UNIX_SOCKET_PREFIX = "unix://"; + private static final String DOCKER_HOST = "DOCKER_HOST"; private static final String DOCKER_TLS_VERIFY = "DOCKER_TLS_VERIFY"; @@ -63,8 +65,9 @@ static RemoteHttpClientTransport createIfPossible(Environment environment, SslCo } private static boolean isLocalFileReference(String host) { + String filePath = host.startsWith(UNIX_SOCKET_PREFIX) ? host.substring(UNIX_SOCKET_PREFIX.length()) : host; try { - return Files.exists(Paths.get(host)); + return Files.exists(Paths.get(filePath)); } catch (Exception ex) { return false; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/transport/HttpTransportTests.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/transport/HttpTransportTests.java index 39cf67b366e1..38a65a819c91 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/transport/HttpTransportTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/transport/HttpTransportTests.java @@ -50,6 +50,15 @@ void createWhenDockerHostVariableIsFileReturnsLocal(@TempDir Path tempDir) throw assertThat(transport).isInstanceOf(LocalHttpClientTransport.class); } + @Test + void createWhenDockerHostVariableIsUnixSchemePrefixedFileReturnsLocal(@TempDir Path tempDir) throws IOException { + String dummySocketFilePath = "unix://" + + Files.createTempFile(tempDir, "http-transport", null).toAbsolutePath().toString(); + Map environment = Collections.singletonMap("DOCKER_HOST", dummySocketFilePath); + HttpTransport transport = HttpTransport.create(environment::get); + assertThat(transport).isInstanceOf(LocalHttpClientTransport.class); + } + @Test void createWhenDoesNotHaveDockerHostVariableReturnsLocal() { HttpTransport transport = HttpTransport.create((name) -> null);