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);
}
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free