Существует ошибка, которая вызывает циклическое перенаправление в Apache HttpClient начиная с 4.0, она не была исправлена даже в последней версии.
В DefaultRequestDirector.java он создает HttpRedirect для выполнения перенаправления, и онбудет повторно использовать все заголовки в вашем исходном HttpGet, проблема здесь в том, что он также будет повторно использовать заголовок Host , что означает, что сервер все равно получит исходный хост после попытки перенаправления на новый URI.
Я исправил это, переопределив DefaultRequestDirector:
public class RedirectRequestDirector extends DefaultRequestDirector
{
RedirectRequestDirector(
final HttpRequestExecutor requestExec,
final ClientConnectionManager conman,
final ConnectionReuseStrategy reustrat,
final ConnectionKeepAliveStrategy kastrat,
final HttpRoutePlanner rouplan,
final HttpProcessor httpProcessor,
final HttpRequestRetryHandler retryHandler,
final RedirectHandler redirectHandler,
final AuthenticationHandler targetAuthHandler,
final AuthenticationHandler proxyAuthHandler,
final UserTokenHandler userTokenHandler,
final HttpParams params)
{
super(requestExec, conman, reustrat, kastrat, rouplan, httpProcessor, retryHandler, redirectHandler, targetAuthHandler, proxyAuthHandler, userTokenHandler, params);
}
@Override
protected RoutedRequest handleResponse(RoutedRequest roureq,
HttpResponse response,
HttpContext context)
throws HttpException, IOException
{
RoutedRequest req = super.handleResponse(roureq, response, context);
if(req != null)
{
String redirectTarget = req.getRoute().getTargetHost().getHostName();
req.getRequest().getOriginal().setHeader("Host", redirectTarget);
}
return req;
}
}
и DefaultHttpClient:
public class RedirectHttpClient extends DefaultHttpClient
{
@Override
protected RequestDirector createClientRequestDirector(
final HttpRequestExecutor requestExec,
final ClientConnectionManager conman,
final ConnectionReuseStrategy reustrat,
final ConnectionKeepAliveStrategy kastrat,
final HttpRoutePlanner rouplan,
final HttpProcessor httpProcessor,
final HttpRequestRetryHandler retryHandler,
final RedirectHandler redirectHandler,
final AuthenticationHandler targetAuthHandler,
final AuthenticationHandler proxyAuthHandler,
final UserTokenHandler stateHandler,
final HttpParams params) {
return new RedirectRequestDirector(
requestExec,
conman,
reustrat,
kastrat,
rouplan,
httpProcessor,
retryHandler,
redirectHandler,
targetAuthHandler,
proxyAuthHandler,
stateHandler,
params);
}
}
Теперь я не буду жаловаться на Circular Redirect.