1 package org.oxerr.chbtc;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.URI;
6 import java.util.ArrayList;
7 import java.util.Arrays;
8 import java.util.Collection;
9 import java.util.List;
10
11 import org.apache.http.Header;
12 import org.apache.http.NameValuePair;
13 import org.apache.http.StatusLine;
14 import org.apache.http.client.config.RequestConfig;
15 import org.apache.http.client.entity.UrlEncodedFormEntity;
16 import org.apache.http.client.methods.CloseableHttpResponse;
17 import org.apache.http.client.methods.HttpGet;
18 import org.apache.http.client.methods.HttpPost;
19 import org.apache.http.client.methods.HttpUriRequest;
20 import org.apache.http.impl.client.CloseableHttpClient;
21 import org.apache.http.impl.client.HttpClientBuilder;
22 import org.apache.http.impl.client.LaxRedirectStrategy;
23 import org.apache.http.message.BasicHeader;
24 import org.oxerr.chbtc.dto.valuereader.JsonValueReader;
25 import org.oxerr.chbtc.dto.valuereader.JsonValueTypeRefReader;
26 import org.oxerr.chbtc.dto.valuereader.ValueReader;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 import com.fasterxml.jackson.core.JsonParser.Feature;
31 import com.fasterxml.jackson.core.type.TypeReference;
32 import com.fasterxml.jackson.databind.ObjectMapper;
33
34 public class HttpClient implements AutoCloseable {
35
36
37
38
39 private static final int SC_OK = 200;
40
41 private final Logger log = LoggerFactory.getLogger(HttpClient.class);
42
43 private final CloseableHttpClient httpClient;
44
45 private final ObjectMapper objectMapper;
46
47 public HttpClient(
48 int socketTimeout,
49 int connectTimeout,
50 int connectionRequestTimeout) {
51 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
52 httpClientBuilder.setRedirectStrategy(new LaxRedirectStrategy());
53
54 String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.71 (KHTML, like Gecko) Version/6.1 Safari/537.71";
55 httpClientBuilder.setUserAgent(userAgent);
56
57 Collection<Header> defaultHeaders = new ArrayList<>();
58 defaultHeaders.add(new BasicHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"));
59 httpClientBuilder.setDefaultHeaders(defaultHeaders);
60
61 RequestConfig defaultRequestConfig = RequestConfig.custom()
62 .setSocketTimeout(socketTimeout)
63 .setConnectTimeout(connectTimeout)
64 .setConnectionRequestTimeout(connectionRequestTimeout)
65 .build();
66 httpClientBuilder.setDefaultRequestConfig(defaultRequestConfig);
67
68 httpClient = httpClientBuilder.build();
69
70 objectMapper = new ObjectMapper();
71 objectMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
72 }
73
74 public <T> T get(URI uri, Class<T> valueType) throws IOException {
75 return get(uri, new JsonValueReader<T>(objectMapper, valueType));
76 }
77
78 public <T> T get(URI uri, TypeReference<T> valueTypeRef) throws IOException {
79 return get(uri, new JsonValueTypeRefReader<T>(objectMapper, valueTypeRef));
80 }
81
82 public <T> T get(URI uri, ValueReader<T> valueReader) throws IOException {
83 return execute(valueReader, new HttpGet(uri));
84 }
85
86 public <T> T post(URI uri, ValueReader<T> valueReader,
87 NameValuePair... params) throws IOException {
88 return post(uri, valueReader, Arrays.asList(params));
89 }
90
91 public <T> T post(URI uri, ValueReader<T> valueReader,
92 List<NameValuePair> params) throws IOException {
93 HttpPost post = new HttpPost(uri);
94 post.setEntity(new UrlEncodedFormEntity(params));
95 return execute(valueReader, post);
96 }
97
98 private <T> T execute(
99 final ValueReader<T> valueReader,
100 final HttpUriRequest request) throws IOException {
101 log.debug("Executing: {}", request.getURI());
102 try (CloseableHttpResponse response = httpClient.execute(request)) {
103 final StatusLine statusLine = response.getStatusLine();
104 if (statusLine.getStatusCode() == SC_OK) {
105 try (InputStream content = response.getEntity().getContent()) {
106 return valueReader.read(content);
107 }
108 } else {
109 throw new IOException(statusLine.getReasonPhrase());
110 }
111 }
112 }
113
114
115
116
117 @Override
118 public void close() throws IOException {
119 httpClient.close();
120 }
121
122 }