this.log.debug("[exchange: " + state.getId() + "] Response processed");
}
connManager.releaseConnection();
} else {
if (state.getRedirect() != null) {
final HttpUriRequest redirect = state.getRedirect();
final URI uri = redirect.getURI();
if (this.log.isDebugEnabled()) {
this.log.debug("[exchange: " + state.getId() + "] Redirecting to '" + uri + "'");
}
state.setRedirect(null);
final HttpHost newTarget = URIUtils.extractHost(uri);
if (newTarget == null) {
throw new ProtocolException("Redirect URI does not specify a valid host name: " + uri);
}
// Reset auth states if redirecting to another host
final HttpRoute route = state.getRoute();
if (!route.getTargetHost().equals(newTarget)) {
final AuthState targetAuthState = localContext.getTargetAuthState();
if (this.log.isDebugEnabled()) {
this.log.debug("[exchange: " + state.getId() + "] Resetting target auth state");
}
targetAuthState.reset();
final AuthState proxyAuthState = localContext.getProxyAuthState();
final AuthScheme authScheme = proxyAuthState.getAuthScheme();
if (authScheme != null && authScheme.isConnectionBased()) {
if (this.log.isDebugEnabled()) {
this.log.debug("[exchange: " + state.getId() + "] Resetting proxy auth state");
}
proxyAuthState.reset();
}
}
if (!redirect.headerIterator().hasNext()) {
final HttpRequest original = state.getMainRequest().getOriginal();
redirect.setHeaders(original.getAllHeaders());
}
final HttpRequestWrapper newRequest = HttpRequestWrapper.wrap(redirect);
final HttpRoute newRoute = this.routePlanner.determineRoute(
newTarget, newRequest, localContext);