package com.bao.lc.client.impl;
import java.net.URI;
import java.util.List;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ProtocolException;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultRedirectStrategy;
import org.apache.http.protocol.HttpContext;
import com.bao.lc.client.utils.HttpClientUtils;
public class PostRedirectStrategy extends DefaultRedirectStrategy
{
private static final Log log = LogFactory.getLog(PostRedirectStrategy.class);
private List<HttpUriRequest> redirectChain = new Vector<HttpUriRequest>(2);
public PostRedirectStrategy()
{
super();
}
public boolean isRedirected(final HttpRequest request, final HttpResponse response,
final HttpContext context) throws ProtocolException
{
boolean ret = super.isRedirected(request, response, context);
if(!ret)
{
int statusCode = response.getStatusLine().getStatusCode();
Header locationHeader = response.getFirstHeader("location");
if((locationHeader != null)
&& (statusCode == HttpStatus.SC_MOVED_TEMPORARILY || statusCode == HttpStatus.SC_MOVED_PERMANENTLY))
{
ret = true;
}
}
return ret;
}
public HttpUriRequest getRedirect(final HttpRequest request, final HttpResponse response,
final HttpContext context) throws ProtocolException
{
HttpUriRequest redirectReq = super.getRedirect(request, response, context);
//record the redirect request
redirectChain.add(redirectReq);
//log if possible
if(log.isDebugEnabled())
{
String redirectLog = getRedirectLog(request, redirectReq, context);
if(redirectLog != null)
{
log.debug(redirectLog);
}
}
return redirectReq;
}
private String getRedirectLog(final HttpRequest request, final HttpUriRequest redirectReq,
final HttpContext context)
{
// 1. From URI
URI fromURI = HttpClientUtils.getRequestURI(request, context);
if(fromURI == null)
{
return null;
}
// 2. To URI
URI toURI = redirectReq.getURI();
StringBuilder sb = new StringBuilder();
sb.append("[Redirect]: count=").append(redirectChain.size());
sb.append(", ").append(fromURI.toString()).append("==>").append(toURI.toString());
return sb.toString();
}
public List<HttpUriRequest> getRedirectChain()
{
return this.redirectChain;
}
public boolean isPostRedirected()
{
return !redirectChain.isEmpty();
}
public void resetChain()
{
redirectChain.clear();
}
public HttpUriRequest getFinalRequest()
{
if(!isPostRedirected())
{
return null;
}
return redirectChain.get(redirectChain.size() - 1);
}
}