package com.nvarghese.beowulf.common.http.wrapper; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ContentType; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HttpResponseWrapper extends HttpMessageWrapper { private StatusLine statusLine; private HttpResponse httpResponse; private ContentType contentType; private List<Header> headers; private byte[] responseBody; static Logger logger = LoggerFactory.getLogger(HttpResponseWrapper.class); HttpResponseWrapper() { super(); headers = new ArrayList<Header>(); } public HttpResponseWrapper(HttpResponse httpResponse) { this(); this.httpResponse = httpResponse; parseHttpResponse(); } public HttpResponseWrapper(BasicStatusLine statusLine, List<? extends Header> headers, byte[] responseBody) { this(); this.statusLine = statusLine; this.headers.addAll(headers); this.responseBody = responseBody; parseResonseBody(); } private void parseResonseBody() { httpResponse = new BasicHttpResponse(statusLine); ByteArrayEntity entity = new ByteArrayEntity(responseBody); httpResponse.setEntity(entity); httpResponse.setHeaders(headers.toArray(new Header[0])); //set content type Header contentTypeHeader = this.getFirstHeader(HttpHeaders.CONTENT_TYPE); if (contentTypeHeader != null) { contentType = ContentType.parse(contentTypeHeader.getValue()); } else { contentType = ContentType.getOrDefault(entity); } } private void parseHttpResponse() { this.headers.addAll(Arrays.asList(httpResponse.getAllHeaders())); HttpEntity entity = httpResponse.getEntity(); // preps an empty response body, incase it was empty responseBody = new byte[0]; Header contentEncodingHeader = this.getFirstHeader(HttpHeaders.CONTENT_ENCODING); if (entity != null) { //set content type Header contentTypeHeader = this.getFirstHeader(HttpHeaders.CONTENT_TYPE); if (contentTypeHeader != null) { contentType = ContentType.parse(contentTypeHeader.getValue()); } else { contentType = ContentType.getOrDefault(entity); } try { // already decompressed if ResponseContentEncoding interceptor // is enabled responseBody = EntityUtils.toByteArray(entity); } catch (IOException e) { logger.error("Problem processing HTTP response. Reason: {} ", e.getMessage(), e); } } statusLine = httpResponse.getStatusLine(); } public StatusLine getStatusLine() { return statusLine; } public HttpResponse getHttpResponse() { return httpResponse; } public List<? extends Header> getHeaders() { return headers; } public byte[] getResponseBody() { return responseBody; } public Header getFirstHeader(String headerName) { return httpResponse.getFirstHeader(headerName); } public ContentType getContentType() { return contentType; } }