1 | package fr.sii.ogham.sms.util; | |
2 | ||
3 | import java.io.IOException; | |
4 | import java.util.ArrayList; | |
5 | import java.util.Arrays; | |
6 | import java.util.HashMap; | |
7 | import java.util.List; | |
8 | import java.util.Map; | |
9 | import java.util.Map.Entry; | |
10 | import java.util.Set; | |
11 | ||
12 | import org.apache.http.HttpResponse; | |
13 | import org.apache.http.NameValuePair; | |
14 | import org.apache.http.client.HttpClient; | |
15 | import org.apache.http.client.methods.HttpGet; | |
16 | import org.apache.http.client.utils.URLEncodedUtils; | |
17 | import org.apache.http.impl.client.HttpClientBuilder; | |
18 | import org.apache.http.message.BasicNameValuePair; | |
19 | import org.slf4j.Logger; | |
20 | import org.slf4j.LoggerFactory; | |
21 | ||
22 | import fr.sii.ogham.core.exception.util.HttpException; | |
23 | import fr.sii.ogham.core.util.BeanUtils; | |
24 | import fr.sii.ogham.core.util.IOUtils; | |
25 | import fr.sii.ogham.sms.util.http.Parameter; | |
26 | import fr.sii.ogham.sms.util.http.Response; | |
27 | ||
28 | /** | |
29 | * Utility class that helps to send HTTP requests. | |
30 | * | |
31 | * @author Aurélien Baudet | |
32 | * | |
33 | */ | |
34 | public final class HttpUtils { | |
35 | private static final Logger LOG = LoggerFactory.getLogger(HttpUtils.class); | |
36 | private static final HttpClient CLIENT = HttpClientBuilder.create().useSystemProperties().build(); | |
37 | ||
38 | /** | |
39 | * Do a GET request on the provided URL and construct the Query String part | |
40 | * with the provided list of parameters. If the URL already contains | |
41 | * parameters (already contains a '?' character), then the parameters are | |
42 | * added to the existing parameters. The parameters are converted into | |
43 | * <code>application/x-www-form-urlencoded</code>. For example: | |
44 | * <code>field1=value1&field1=value2&field2=value3</code>. The special | |
45 | * characters are encoded. If there is a space, it is encoded into '%20'. | |
46 | * | |
47 | * @param url | |
48 | * the base url | |
49 | * @param params | |
50 | * the list of parameters to append to the query string | |
51 | * @return the response | |
52 | * @throws HttpException | |
53 | * when the request has failed | |
54 | */ | |
55 | public static Response get(String url, List<Parameter> params) throws HttpException { | |
56 | String fullUrl = url; | |
57 | String paramsStr = URLEncodedUtils.format(convert(params), "UTF-8"); | |
58 |
2
1. get : negated conditional → NO_COVERAGE 2. get : negated conditional → KILLED |
fullUrl += (fullUrl.contains("?") ? "&" : "?") + paramsStr; |
59 | // spaces are replaced by '+' but some servers doesn't handle it | |
60 | // correctly | |
61 | // => convert space to '%20' | |
62 | fullUrl = fullUrl.replace("+", "%20"); | |
63 | try { | |
64 | LOG.debug("Sending HTTP GET request to {}", fullUrl); | |
65 | HttpGet request = new HttpGet(fullUrl); | |
66 | HttpResponse response = CLIENT.execute(request); | |
67 | int statusCode = response.getStatusLine().getStatusCode(); | |
68 | LOG.debug("HTTP GET request successfully sent to {}. Status code: {}", fullUrl, statusCode); | |
69 |
2
1. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → NO_COVERAGE 2. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → KILLED |
return new Response(statusCode, IOUtils.toString(response.getEntity().getContent())); |
70 | } catch (IOException e) { | |
71 | throw new HttpException("Failed to send GET request to " + fullUrl, e); | |
72 | } | |
73 | } | |
74 | ||
75 | /** | |
76 | * Do a GET request on the provided URL and construct the Query String part | |
77 | * with the provided list of parameters. If the URL already contains | |
78 | * parameters (already contains a '?' character), then the parameters are | |
79 | * added to the existing parameters. The parameters are converted into | |
80 | * <code>application/x-www-form-urlencoded</code>. For example: | |
81 | * <code>field1=value1&field1=value2&field2=value3</code>. The special | |
82 | * characters are encoded. If there is a space, it is encoded into '%20'. | |
83 | * | |
84 | * @param url | |
85 | * the base url | |
86 | * @param params | |
87 | * none, one or several parameters to append to the query string | |
88 | * @return the response | |
89 | * @throws HttpException | |
90 | * when the request has failed | |
91 | */ | |
92 | public static Response get(String url, Parameter... params) throws HttpException { | |
93 |
1
1. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → NO_COVERAGE |
return get(url, Arrays.asList(params)); |
94 | } | |
95 | ||
96 | /** | |
97 | * <p> | |
98 | * Do a GET request on the provided URL and construct the Query String part | |
99 | * with the provided list of parameters. If the URL already contains | |
100 | * parameters (already contains a '?' character), then the parameters are | |
101 | * added to the existing parameters. The parameters are converted into | |
102 | * <code>application/x-www-form-urlencoded</code>. For example: | |
103 | * <code>field1=value1&field1=value2&field2=value3</code>. The special | |
104 | * characters are encoded. If there is a space, it is encoded into '%20'. | |
105 | * </p> | |
106 | * The parameters can be anything: | |
107 | * <ul> | |
108 | * <li>{@link Parameter}: see {@link #get(String, Parameter...)}</li> | |
109 | * <li>{@link Map}: each entry is used as a parameter (see | |
110 | * {@link #get(String, Map)}). The key of the entry is the name of the | |
111 | * parameter, the value of the entry is the value of the parameter</li> | |
112 | * <li>A bean (any object): each property of the bean is used as parameter | |
113 | * (see {@link BeanUtils}). The name of the property is the name of the | |
114 | * parameter, the value of the property is the value of the parameter</li> | |
115 | * </ul> | |
116 | * | |
117 | * @param url | |
118 | * the base url | |
119 | * @param params | |
120 | * none, one or several parameters to append to the query string | |
121 | * @return the response | |
122 | * @throws HttpException | |
123 | * when the request has failed | |
124 | */ | |
125 | @SuppressWarnings("unchecked") | |
126 | public static Response get(String url, Object... params) throws HttpException { | |
127 | Map<String, Object> map = new HashMap<>(); | |
128 | for (Object bean : params) { | |
129 |
2
1. get : negated conditional → NO_COVERAGE 2. get : negated conditional → KILLED |
if (bean instanceof Parameter) { |
130 | Parameter p = (Parameter) bean; | |
131 | map.put(p.getName(), p.getValue()); | |
132 |
2
1. get : negated conditional → NO_COVERAGE 2. get : negated conditional → KILLED |
} else if (bean instanceof Map) { |
133 |
1
1. get : removed call to java/util/Map::putAll → NO_COVERAGE |
map.putAll((Map<String, Object>) bean); |
134 | } else { | |
135 |
2
1. get : removed call to java/util/Map::putAll → NO_COVERAGE 2. get : removed call to java/util/Map::putAll → KILLED |
map.putAll(BeanUtils.convert(bean)); |
136 | } | |
137 | } | |
138 |
2
1. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → NO_COVERAGE 2. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → KILLED |
return get(url, map); |
139 | } | |
140 | ||
141 | /** | |
142 | * Do a GET request on the provided URL and construct the Query String part | |
143 | * with the provided list of parameters. If the URL already contains | |
144 | * parameters (already contains a '?' character), then the parameters are | |
145 | * added to the existing parameters. The parameters are converted into | |
146 | * <code>application/x-www-form-urlencoded</code>. For example: | |
147 | * <code>field1=value1&field1=value2&field2=value3</code>. The special | |
148 | * characters are encoded. If there is a space, it is encoded into '%20'. | |
149 | * <p> | |
150 | * Each entry of the map is used as a parameter. The key of the entry is the | |
151 | * name of the parameter, the value of the entry is the value of the | |
152 | * parameter | |
153 | * </p> | |
154 | * | |
155 | * @param url | |
156 | * the base url | |
157 | * @param params | |
158 | * none, one or several parameters to append to the query string | |
159 | * @return the response | |
160 | * @throws HttpException | |
161 | * when the request has failed | |
162 | */ | |
163 | public static Response get(String url, Map<String, Object> params) throws HttpException { | |
164 |
2
1. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → NO_COVERAGE 2. get : replaced return value with null for fr/sii/ogham/sms/util/HttpUtils::get → KILLED |
return get(url, convert(params)); |
165 | } | |
166 | ||
167 | /** | |
168 | * Convert the map into a list of parameters | |
169 | * | |
170 | * @param map | |
171 | * the map to convert | |
172 | * @return the list of parameters | |
173 | */ | |
174 | private static List<Parameter> convert(Map<String, Object> map) { | |
175 | Set<Entry<String, Object>> entries = map.entrySet(); | |
176 | List<Parameter> parameters = new ArrayList<>(entries.size()); | |
177 | for (Entry<String, Object> entry : entries) { | |
178 |
2
1. convert : negated conditional → NO_COVERAGE 2. convert : negated conditional → KILLED |
if (entry.getValue() != null) { |
179 | parameters.add(new Parameter(entry.getKey(), entry.getValue().toString())); | |
180 | } | |
181 | } | |
182 |
2
1. convert : replaced return value with Collections.emptyList for fr/sii/ogham/sms/util/HttpUtils::convert → NO_COVERAGE 2. convert : replaced return value with Collections.emptyList for fr/sii/ogham/sms/util/HttpUtils::convert → KILLED |
return parameters; |
183 | } | |
184 | ||
185 | /** | |
186 | * Convert a list of parameters to a list of {@link NameValuePair}. | |
187 | * | |
188 | * @param params | |
189 | * the parameters abstraction used in the library | |
190 | * @return the parameters used by the real implementation (Apache Commons | |
191 | * HTTP) | |
192 | */ | |
193 | private static List<NameValuePair> convert(List<Parameter> params) { | |
194 | List<NameValuePair> pairs = new ArrayList<>(params.size()); | |
195 | for (Parameter param : params) { | |
196 |
2
1. convert : negated conditional → NO_COVERAGE 2. convert : negated conditional → KILLED |
if (param.getValue() != null) { |
197 | pairs.add(new BasicNameValuePair(param.getName(), param.getValue())); | |
198 | } | |
199 | } | |
200 |
2
1. convert : replaced return value with Collections.emptyList for fr/sii/ogham/sms/util/HttpUtils::convert → NO_COVERAGE 2. convert : replaced return value with Collections.emptyList for fr/sii/ogham/sms/util/HttpUtils::convert → KILLED |
return pairs; |
201 | } | |
202 | ||
203 | private HttpUtils() { | |
204 | super(); | |
205 | } | |
206 | } | |
Mutations | ||
58 |
1.1 2.2 |
|
69 |
1.1 2.2 |
|
93 |
1.1 |
|
129 |
1.1 2.2 |
|
132 |
1.1 2.2 |
|
133 |
1.1 |
|
135 |
1.1 2.2 |
|
138 |
1.1 2.2 |
|
164 |
1.1 2.2 |
|
178 |
1.1 2.2 |
|
182 |
1.1 2.2 |
|
196 |
1.1 2.2 |
|
200 |
1.1 2.2 |