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.HashMap;
16 import java.util.Map;
17
18 public class HttpClientResponse implements Response
19 {
20
21 private final int statusCode;
22 private final String statusText;
23 private final byte[] body;
24 private final Charset bodyCharset;
25 private final Map<String, String> headers;
26
27 public HttpClientResponse(final CloseableHttpResponse response) throws IOException
28 {
29 statusCode = response.getStatusLine().getStatusCode();
30 statusText = response.getStatusLine().getReasonPhrase();
31
32 body = EntityUtils.toByteArray(response.getEntity());
33 bodyCharset = ContentType.getOrDefault(response.getEntity()).getCharset();
34
35 Map<String, String> extractedHeaders = new HashMap<>();
36 for (Header header : response.getAllHeaders())
37 {
38 extractedHeaders.put(header.getName(), header.getValue());
39 }
40 headers = Collections.unmodifiableMap(extractedHeaders);
41 }
42
43 @Override
44 public int getStatusCode()
45 {
46 return statusCode;
47 }
48
49 @Override
50 public String getStatusText()
51 {
52 return statusText;
53 }
54
55 @Override
56 public boolean isSuccessful()
57 {
58 return statusCode >= 200 && statusCode < 400;
59 }
60
61 @Override
62 public String getHeader(final String name)
63 {
64 return headers.get(name);
65 }
66
67 @Override
68 public Map<String, String> getHeaders()
69 {
70 return headers;
71 }
72
73 @Override
74 public String getResponseBodyAsString() throws ResponseException
75 {
76 Charset decodeCharset = (bodyCharset != null) ? bodyCharset : Charset.defaultCharset();
77 return new String(body, decodeCharset);
78 }
79
80 @Override
81 public InputStream getResponseBodyAsStream() throws ResponseException
82 {
83 return new ByteArrayInputStream(body);
84 }
85
86 @Override
87 public <T> T getEntity(final Class<T> entityClass) throws ResponseException
88 {
89 throw new UnsupportedOperationException("Not implemented");
90 }
91
92 }