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 }