Home / Class/ LocalHttpClientTransport Class — spring-boot Architecture

LocalHttpClientTransport Class — spring-boot Architecture

Architecture documentation for the LocalHttpClientTransport class in LocalHttpClientTransport.java from the spring-boot codebase.

Entity Profile

Relationship Graph

Source Code

buildpack/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/transport/LocalHttpClientTransport.java lines 55–160

final class LocalHttpClientTransport extends HttpClientTransport {

	private static final String DOCKER_SCHEME = "docker";

	private static final int DEFAULT_DOCKER_PORT = 2376;

	private static final HttpHost LOCAL_DOCKER_HOST = new HttpHost(DOCKER_SCHEME, "localhost", DEFAULT_DOCKER_PORT);

	private LocalHttpClientTransport(HttpClient client, HttpHost host) {
		super(client, host);
	}

	@Override
	protected void beforeExecute(HttpRequest request) {
		request.setHeader("Host", LOCAL_DOCKER_HOST.toHostString());
	}

	static LocalHttpClientTransport create(ResolvedDockerHost dockerHost) {
		HttpClientBuilder builder = HttpClients.custom()
			.setConnectionManager(new LocalConnectionManager(dockerHost))
			.setRoutePlanner(new LocalRoutePlanner());
		HttpHost host = new HttpHost(DOCKER_SCHEME, dockerHost.getAddress());
		return new LocalHttpClientTransport(builder.build(), host);
	}

	/**
	 * {@link HttpClientConnectionManager} for local Docker.
	 */
	private static class LocalConnectionManager extends BasicHttpClientConnectionManager {

		private static final ConnectionConfig CONNECTION_CONFIG = ConnectionConfig.copy(ConnectionConfig.DEFAULT)
			.setValidateAfterInactivity(TimeValue.NEG_ONE_MILLISECOND)
			.build();

		private static final Lookup<@Nullable TlsSocketStrategy> NO_TLS_SOCKET = (name) -> null;

		LocalConnectionManager(ResolvedDockerHost dockerHost) {
			super(createHttpClientConnectionOperator(dockerHost), null);
			setConnectionConfig(CONNECTION_CONFIG);
		}

		private static DefaultHttpClientConnectionOperator createHttpClientConnectionOperator(
				ResolvedDockerHost dockerHost) {
			LocalDetachedSocketFactory detachedSocketFactory = new LocalDetachedSocketFactory(dockerHost);
			LocalDnsResolver dnsResolver = new LocalDnsResolver();
			return new DefaultHttpClientConnectionOperator(detachedSocketFactory, null, dnsResolver, NO_TLS_SOCKET);
		}

	}

	/**
	 * {@link DetachedSocketFactory} for local Docker.
	 */
	static class LocalDetachedSocketFactory implements DetachedSocketFactory {

		private static final String NPIPE_PREFIX = "npipe://";

		private final ResolvedDockerHost dockerHost;

		LocalDetachedSocketFactory(ResolvedDockerHost dockerHost) {
			this.dockerHost = dockerHost;
		}

		@Override
		public Socket create(Proxy proxy) throws IOException {
			String address = this.dockerHost.getAddress();
			if (address.startsWith(NPIPE_PREFIX)) {
				return NamedPipeSocket.get(address.substring(NPIPE_PREFIX.length()));
			}
			return (!Platform.isWindows()) ? UnixDomainSocket.get(address) : NamedPipeSocket.get(address);
		}

	}

	/**
	 * {@link DnsResolver} that ensures only the loopback address is used.
	 */
	private static final class LocalDnsResolver implements DnsResolver {

		private static final InetAddress LOOPBACK = InetAddress.getLoopbackAddress();

		@Override
		public InetAddress[] resolve(String host) {
			return new InetAddress[] { LOOPBACK };
		}

		@Override
		public String resolveCanonicalHostname(String host) {
			return LOOPBACK.getCanonicalHostName();
		}

	}

	/**
	 * {@link HttpRoutePlanner} for local Docker.
	 */
	private static final class LocalRoutePlanner implements HttpRoutePlanner {

		@Override
		public HttpRoute determineRoute(HttpHost target, HttpContext context) {
			return new HttpRoute(LOCAL_DOCKER_HOST);
		}

	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free