Avoid Circular Redirect using HttpClient 4.1.1

前端 未结 6 604
花落未央
花落未央 2020-12-10 02:39

How can I avoid circular redirect using HttpClient 4.1.1. As I am getting the error like this:-

executing requestGET http://home.somehost.com/Mynet/pages/cHo         


        
6条回答
  •  情歌与酒
    2020-12-10 03:01

    There is a bug that will cause circular redirect in Apache HttpClient since 4.0, it wasn't fixed even in the latest version.

    In DefaultRequestDirector.java, it creates a HttpRedirect to perform redirection, and it will reuse all headers in your original HttpGet, the problem here is it will also reuse Host header, which mean the server will still get the original host after it's attempt to redirect to new URI.

    I fixed this by reimplemented the 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;
        }
    
    }
    

    and 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);
        }
    }
    

    Now I won't complain about the Circular Redirect.

提交回复
热议问题