package br.com.caelum.restfulie.http.apache;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import br.com.caelum.restfulie.Response;
import br.com.caelum.restfulie.RestClient;
import br.com.caelum.restfulie.RestfulieException;
import br.com.caelum.restfulie.http.Headers;
import br.com.caelum.restfulie.http.Request;
public class ApacheResponse implements Response {
private final HttpResponse response;
private final RestClient client;
private HttpEntity entity;
private final Request details;
public ApacheResponse(HttpResponse response, RestClient client, Request details) {
this.response = response;
this.client = client;
this.details = details;
this.entity = response.getEntity();
}
public int getCode() {
return response.getStatusLine().getStatusCode();
}
public String getContent() {
if (entity == null) {
return "";
}
try {
long len = entity.getContentLength();
if (len < 10 * 1024 * 1024) {
return EntityUtils.toString(entity);
} else {
return "";
}
} catch (IOException ex) {
throw new RestfulieException("Unable to parse response content", ex);
}
}
public List<String> getHeader(String key) {
return getHeaders().get(key);
}
public <T> T getResource() {
String contentType = getType();
String content = getContent();
return (T) client.getMediaTypes().forContentType(contentType)
.unmarshal(content, client);
}
public String getType() {
return getHeaders().getMain("Content-Type");
}
public Headers getHeaders() {
return new ApacheHeaders(response,client);
}
public void discard() throws IOException {
response.getEntity().consumeContent();
}
public URI getLocation() {
try {
String location = getHeaders().getFirst("Location");
if(location == null || location.equals(""))
return getRequest().getURI();
else
return new URI(location);
} catch (URISyntaxException e) {
throw new RestfulieException("Invalid URI received as a response", e);
}
}
public Request getRequest() {
return details;
}
public String getStatusLine() {
return response.getStatusLine().getReasonPhrase();
}
}