final NHttpClientConnection managedConn = connManager.getConnection();
if (!state.isRouteEstablished() && state.getRouteTracker() == null) {
state.setRouteEstablished(this.connmgr.isRouteComplete(managedConn));
if (!state.isRouteEstablished()) {
this.log.debug("Start connection routing");
state.setRouteTracker(new RouteTracker(route));
} else {
this.log.debug("Connection route already established");
}
}
if (!state.isRouteEstablished()) {
final RouteTracker routeTracker = state.getRouteTracker();
int step;
loop:
do {
final HttpRoute fact = routeTracker.toRoute();
step = this.routeDirector.nextStep(route, fact);
switch (step) {
case HttpRouteDirector.CONNECT_TARGET:
this.connmgr.startRoute(managedConn, route, localContext);
routeTracker.connectTarget(route.isSecure());
break;
case HttpRouteDirector.CONNECT_PROXY:
this.connmgr.startRoute(managedConn, route, localContext);
final HttpHost proxy = route.getProxyHost();
routeTracker.connectProxy(proxy, false);
break;
case HttpRouteDirector.TUNNEL_TARGET:
if (this.log.isDebugEnabled()) {
this.log.debug("[exchange: " + state.getId() + "] Tunnel required");
}
final HttpRequest connect = createConnectRequest(route, state);
state.setCurrentRequest(HttpRequestWrapper.wrap(connect));
break loop;
case HttpRouteDirector.TUNNEL_PROXY:
throw new HttpException("Proxy chains are not supported");
case HttpRouteDirector.LAYER_PROTOCOL:
this.connmgr.upgrade(managedConn, route, localContext);
routeTracker.layerProtocol(route.isSecure());
break;
case HttpRouteDirector.UNREACHABLE:
throw new HttpException("Unable to establish route: " +
"planned = " + route + "; current = " + fact);
case HttpRouteDirector.COMPLETE: