package br.com.caelum.restfulie.feature; import java.net.URI; import br.com.caelum.restfulie.Response; import br.com.caelum.restfulie.RestClient; import br.com.caelum.restfulie.http.Request; import br.com.caelum.restfulie.request.ResponseChain; /** * A feature that automatically follows 300~399 and 201 codes by using the * Location header. * * @author guilherme silveira */ public class FollowRedirects implements ResponseFeature { private final RestClient client; public FollowRedirects(RestClient client) { this.client = client; } public Response process(ResponseChain chain, Response response) { if (shouldRedirect(response)) { String uri = response.getHeader("Location").get(0); Request request = response.getRequest(); if (uri.charAt(0) == '/') { URI target = request.getURI().resolve(uri); return client.at(target).addHeaders(request.getHeaders()).get(); } return client.at(uri).addHeaders(request.getHeaders()).get(); } return response; } /** * Extension point that redirects 201 and 3XX. Overwrite to redirect only * the ones you want. */ protected boolean shouldRedirect(Response response) { return response.getCode() / 100 == 3 || response.getCode() == 201; } }