View Javadoc
1   package com.atlassian.sal.core.net;
2   
3   import com.atlassian.sal.api.net.Response;
4   import com.atlassian.sal.api.net.ResponseException;
5   import org.apache.http.Header;
6   import org.apache.http.client.methods.CloseableHttpResponse;
7   import org.apache.http.entity.ContentType;
8   import org.apache.http.util.EntityUtils;
9   
10  import java.io.ByteArrayInputStream;
11  import java.io.IOException;
12  import java.io.InputStream;
13  import java.nio.charset.Charset;
14  import java.util.Collections;
15  import java.util.Map;
16  import java.util.TreeMap;
17  
18  public class HttpClientResponse implements Response {
19  
20      private final int statusCode;
21      private final String statusText;
22      private final byte[] body;
23      private final Charset bodyCharset;
24      private final Map<String, String> headers;
25  
26      public HttpClientResponse(final CloseableHttpResponse response) throws IOException {
27          statusCode = response.getStatusLine().getStatusCode();
28          statusText = response.getStatusLine().getReasonPhrase();
29          body = (response.getEntity() != null) ? EntityUtils.toByteArray(response.getEntity()) : new byte[0];
30          bodyCharset = ContentType.getOrDefault(response.getEntity()).getCharset();
31          final Map<String, String> extractedHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
32          for (Header header : response.getAllHeaders()) {
33              extractedHeaders.put(header.getName(), header.getValue());
34          }
35          headers = Collections.unmodifiableMap(extractedHeaders);
36      }
37  
38      @Override
39      public int getStatusCode() {
40          return statusCode;
41      }
42  
43      @Override
44      public String getStatusText() {
45          return statusText;
46      }
47  
48      @Override
49      public boolean isSuccessful() {
50          return statusCode >= 200 && statusCode < 400;
51      }
52  
53      @Override
54      public String getHeader(final String name) {
55          return headers.get(name);
56      }
57  
58      @Override
59      public Map<String, String> getHeaders() {
60          return headers;
61      }
62  
63      @Override
64      public String getResponseBodyAsString() throws ResponseException {
65          Charset decodeCharset = (bodyCharset != null) ? bodyCharset : Charset.defaultCharset();
66          return new String(body, decodeCharset);
67      }
68  
69      @Override
70      public InputStream getResponseBodyAsStream() throws ResponseException {
71          return new ByteArrayInputStream(body);
72      }
73  
74      @Override
75      public <T> T getEntity(final Class<T> entityClass) throws ResponseException {
76          throw new UnsupportedOperationException("Not implemented");
77      }
78  
79  }