Skip to content

Commit 3795437

Browse files
committed
refactor request content body
1 parent 43a51e3 commit 3795437

18 files changed

+558
-67
lines changed

pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
</prerequisites>
1616

1717
<!-- Module Description and Ownership -->
18-
<name>ActiveCampaign API Client</name>
19-
<description>A client for ActiveCampaign's API</description>
20-
<url>https://github.com/sourcelaborg/activecampaign-java-client</url>
18+
<name>Http Client Wrapper</name>
19+
<description>A collection of abstracted http rest client libraries.</description>
20+
<url>https://github.com/SourceLabOrg/http-client-wrapper</url>
2121
<developers>
2222
<developer>
2323
<name>Stephen Powis</name>
@@ -37,9 +37,9 @@
3737

3838
<!-- Source Control -->
3939
<scm>
40-
<connection>scm:git:git://github.com/sourcelaborg/HttpClientWrapper.git</connection>
41-
<developerConnection>scm:git:ssh://github.com:sourcelaborg/HttpClientWrapper.git</developerConnection>
42-
<url>https://github.com/SourceLabOrg/HttpClientWrapper/tree/master</url>
40+
<connection>scm:git:git://github.com/sourcelaborg/http-client-wrapper.git</connection>
41+
<developerConnection>scm:git:ssh://github.com:sourcelaborg/http-client-wrapper.git</developerConnection>
42+
<url>https://github.com/SourceLabOrg/http-client-wrapper/tree/master</url>
4343
</scm>
4444

4545
<!-- Module Properties -->

src/main/java/org/sourcelab/http/rest/HttpClientRestClient.java

Lines changed: 87 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,18 @@
4747
import org.slf4j.LoggerFactory;
4848
import org.sourcelab.http.rest.configuration.Configuration;
4949
import org.sourcelab.http.rest.configuration.ProxyConfiguration;
50-
import org.sourcelab.http.rest.configuration.RequestHeader;
50+
import org.sourcelab.http.rest.request.RequestHeader;
5151
import org.sourcelab.http.rest.exceptions.ConnectionException;
5252
import org.sourcelab.http.rest.exceptions.ResultParsingException;
5353
import org.sourcelab.http.rest.handlers.RestResponseHandler;
54+
import org.sourcelab.http.rest.interceptor.HeaderRequestInterceptor;
5455
import org.sourcelab.http.rest.interceptor.RequestContext;
5556
import org.sourcelab.http.rest.interceptor.RequestInterceptor;
5657
import org.sourcelab.http.rest.request.Request;
5758
import org.sourcelab.http.rest.request.RequestMethod;
59+
import org.sourcelab.http.rest.request.RequestParameter;
60+
import org.sourcelab.http.rest.request.body.RequestBodyContent;
61+
import org.sourcelab.http.rest.request.body.UrlEncodedFormBodyContent;
5862

5963
import javax.net.ssl.SSLHandshakeException;
6064
import java.io.IOException;
@@ -65,10 +69,7 @@
6569
import java.net.URL;
6670
import java.nio.charset.StandardCharsets;
6771
import java.util.ArrayList;
68-
import java.util.Collection;
69-
import java.util.Collections;
7072
import java.util.List;
71-
import java.util.Map;
7273
import java.util.concurrent.TimeUnit;
7374

7475
/**
@@ -77,11 +78,6 @@
7778
public class HttpClientRestClient implements RestClient {
7879
private static final Logger logger = LoggerFactory.getLogger(HttpClientRestClient.class);
7980

80-
/**
81-
* Default headers included with every request.
82-
*/
83-
private Collection<RequestHeader> defaultHeaders = new ArrayList<>();
84-
8581
/**
8682
* Save a copy of the configuration.
8783
*/
@@ -97,8 +93,7 @@ public class HttpClientRestClient implements RestClient {
9793
/**
9894
* To allow for custom modifications to request prior to submitting it.
9995
*/
100-
private RequestInterceptor requestInterceptor;
101-
96+
private final List<RequestInterceptor> requestInterceptors = new ArrayList<>();
10297

10398
/**
10499
* Constructor.
@@ -116,14 +111,17 @@ public void init(final Configuration configuration) {
116111
// Save reference to configuration
117112
this.configuration = configuration;
118113

119-
// Load RequestMutator instance from configuration.
120-
requestInterceptor = configuration.getRequestInterceptor();
121-
122114
// Load default headers
123-
if (configuration.getRequestHeaders() != null) {
124-
defaultHeaders = Collections.unmodifiableCollection(configuration.getRequestHeaders());
115+
if (configuration.getRequestHeaders() != null && !configuration.getRequestHeaders().isEmpty()) {
116+
// Add interceptor to add headers to all requests.
117+
requestInterceptors.add(
118+
new HeaderRequestInterceptor(configuration.getRequestHeaders())
119+
);
125120
}
126121

122+
// Load RequestMutator instance from configuration.
123+
requestInterceptors.addAll(configuration.getRequestInterceptors());
124+
127125
// Create https context builder utility.
128126
final HttpsContextBuilder httpsContextBuilder = new HttpsContextBuilder(configuration);
129127

@@ -245,7 +243,7 @@ public RestResponse submitRequest(final Request request) throws RestException {
245243
try {
246244
switch (request.getRequestMethod()) {
247245
case GET:
248-
return submitGetRequest(url, (Map<String, String>) request.getRequestBody(), responseHandler);
246+
return submitGetRequest(url, request.getRequestBody(), responseHandler);
249247
case POST:
250248
return submitPostRequest(url, request.getRequestBody(), responseHandler);
251249
case PUT:
@@ -263,25 +261,33 @@ public RestResponse submitRequest(final Request request) throws RestException {
263261
/**
264262
* Internal GET method.
265263
* @param url Url to GET to.
266-
* @param getParams GET parameters to include in the request
264+
* @param requestBodyContent parameters to include in the request
267265
* @param responseHandler The response Handler to use to parse the response
268266
* @param <T> The type that ResponseHandler returns.
269267
* @return Parsed response.
270268
*/
271-
private <T> T submitGetRequest(final String url, final Map<String, String> getParams, final ResponseHandler<T> responseHandler) throws IOException {
269+
private <T> T submitGetRequest(
270+
final String url,
271+
final RequestBodyContent requestBodyContent,
272+
final ResponseHandler<T> responseHandler
273+
) throws IOException {
272274
final RequestContext requestContext = new RequestContext(url, RequestMethod.GET);
273275

274276
try {
275-
// Pass request parameters through interceptor.
276-
requestInterceptor.modifyRequestParameters(getParams, requestContext);
277-
278277
// Construct URI including our request parameters.
279278
final URIBuilder uriBuilder = new URIBuilder(url)
280279
.setCharset(StandardCharsets.UTF_8);
281280

282-
// Attach submitRequest params
283-
for (final Map.Entry<String, String> entry : getParams.entrySet()) {
284-
uriBuilder.setParameter(entry.getKey(), entry.getValue());
281+
if (requestBodyContent instanceof UrlEncodedFormBodyContent) {
282+
final List<RequestParameter> requestParameters = processRequestParameters(
283+
((UrlEncodedFormBodyContent) requestBodyContent).getRequestParameters(),
284+
requestContext
285+
);
286+
287+
// Attach submitRequest params
288+
for (final RequestParameter requestParameter : requestParameters) {
289+
uriBuilder.setParameter(requestParameter.getName(), requestParameter.getValue());
290+
}
285291
}
286292

287293
// Build Get Request
@@ -306,12 +312,16 @@ private <T> T submitGetRequest(final String url, final Map<String, String> getPa
306312
/**
307313
* Internal POST method.
308314
* @param url Url to POST to.
309-
* @param requestBody POST entity include in the request body
315+
* @param requestBodyContent POST entity include in the request body
310316
* @param responseHandler The response Handler to use to parse the response
311317
* @param <T> The type that ResponseHandler returns.
312318
* @return Parsed response.
313319
*/
314-
private <T> T submitPostRequest(final String url, final Object requestBody, final ResponseHandler<T> responseHandler) throws IOException {
320+
private <T> T submitPostRequest(
321+
final String url,
322+
final RequestBodyContent requestBodyContent,
323+
final ResponseHandler<T> responseHandler
324+
) throws IOException {
315325
final RequestContext requestContext = new RequestContext(url, RequestMethod.POST);
316326

317327
try {
@@ -322,9 +332,9 @@ private <T> T submitPostRequest(final String url, final Object requestBody, fina
322332

323333
// Build request entity
324334
post.setEntity(
325-
buildEntity(requestBody, requestContext)
335+
buildEntity(requestBodyContent, requestContext)
326336
);
327-
logger.debug("Executing request {} with {}", post.getRequestLine(), requestBody);
337+
logger.debug("Executing request {} with {}", post.getRequestLine(), requestBodyContent);
328338

329339
// Execute and return
330340
return httpClient.execute(post, responseHandler, httpClientContext);
@@ -340,12 +350,16 @@ private <T> T submitPostRequest(final String url, final Object requestBody, fina
340350
/**
341351
* Internal PUT method.
342352
* @param url Url to POST to.
343-
* @param requestBody POST entity include in the request body
353+
* @param requestBodyContent POST entity include in the request body
344354
* @param responseHandler The response Handler to use to parse the response
345355
* @param <T> The type that ResponseHandler returns.
346356
* @return Parsed response.
347357
*/
348-
private <T> T submitPutRequest(final String url, final Object requestBody, final ResponseHandler<T> responseHandler) throws IOException {
358+
private <T> T submitPutRequest(
359+
final String url,
360+
final RequestBodyContent requestBodyContent,
361+
final ResponseHandler<T> responseHandler
362+
) throws IOException {
349363
final RequestContext requestContext = new RequestContext(url, RequestMethod.PUT);
350364

351365
try {
@@ -356,9 +370,9 @@ private <T> T submitPutRequest(final String url, final Object requestBody, final
356370

357371
// Build request entity
358372
put.setEntity(
359-
buildEntity(requestBody, requestContext)
373+
buildEntity(requestBodyContent, requestContext)
360374
);
361-
logger.debug("Executing request {} with {}", put.getRequestLine(), requestBody);
375+
logger.debug("Executing request {} with {}", put.getRequestLine(), requestBodyContent);
362376

363377
// Execute and return
364378
return httpClient.execute(put, responseHandler, httpClientContext);
@@ -410,33 +424,60 @@ private String constructApiUrl(final String endPoint) {
410424
return configuration.getApiHost() + endPoint;
411425
}
412426

413-
private HttpEntity buildEntity(final Object parameters, final RequestContext requestContext) throws UnsupportedEncodingException {
414-
if (parameters instanceof Map) {
415-
final Map<String, String> parametersMap = (Map<String, String>) parameters;
416-
417-
// Pass request parameters through interceptor.
418-
requestInterceptor.modifyRequestParameters(parametersMap, requestContext);
427+
private HttpEntity buildEntity(final RequestBodyContent requestBodyContent, final RequestContext requestContext) throws UnsupportedEncodingException {
428+
if (requestBodyContent instanceof UrlEncodedFormBodyContent) {
429+
List<RequestParameter> requestParameters = processRequestParameters(
430+
((UrlEncodedFormBodyContent) requestBodyContent).getRequestParameters(), requestContext
431+
);
419432

420-
// Define required auth params
433+
// Build Form parameters
421434
final List<NameValuePair> params = new ArrayList<>();
422435

423436
// Attach submitRequest params
424-
for (Map.Entry<String, String> entry : parametersMap.entrySet()) {
425-
params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
426-
}
437+
requestParameters
438+
.forEach(parameter -> params.add(new BasicNameValuePair(parameter.getName(), parameter.getValue()))
439+
);
427440
return new UrlEncodedFormEntity(params);
428441
} else {
429-
return new StringEntity(parameters.toString());
442+
return new StringEntity(requestBodyContent.toString());
430443
}
431444
}
432445

446+
/**
447+
* Process headers through requestInteceptor instances.
448+
* @param requestBase The underlying request object.
449+
* @param requestContext Contextual details about the request.
450+
*/
433451
private void buildHeaders(final HttpRequestBase requestBase, final RequestContext requestContext) {
434452
// Pass headers through interceptor interface
435-
final List<RequestHeader> headers = new ArrayList<>(defaultHeaders);
436-
requestInterceptor.modifyHeaders(headers, requestContext);
453+
List<RequestHeader> headers = new ArrayList<>();
454+
for (final RequestInterceptor requestInterceptor : requestInterceptors) {
455+
headers = requestInterceptor.modifyHeaders(headers, requestContext);
456+
}
457+
458+
// Add headers to the request instance.
437459
headers
438460
.stream()
439461
.map((entry) -> new BasicHeader(entry.getName(), entry.getValue()))
440462
.forEach(requestBase::addHeader);
441463
}
464+
465+
/**
466+
* Process request parameters through request interceptors.
467+
*
468+
* @param incomingParameters The defined request parameters.
469+
* @param requestContext Contextual details about the request.
470+
* @return Modified request parameters.
471+
*/
472+
private List<RequestParameter> processRequestParameters(final List<RequestParameter> incomingParameters, final RequestContext requestContext) {
473+
// Copy parameters
474+
List<RequestParameter> requestParameters = new ArrayList<>(incomingParameters);
475+
476+
// Loop over each interceptor
477+
for (final RequestInterceptor requestInterceptor : requestInterceptors) {
478+
// Pass in the parameters and get the returned list.
479+
requestParameters = requestInterceptor.modifyRequestParameters(requestParameters, requestContext);
480+
}
481+
return requestParameters;
482+
}
442483
}

src/main/java/org/sourcelab/http/rest/configuration/BasicConfiguration.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
package org.sourcelab.http.rest.configuration;
1919

20-
import org.sourcelab.http.rest.interceptor.NoopRequestInterceptor;
2120
import org.sourcelab.http.rest.interceptor.RequestInterceptor;
21+
import org.sourcelab.http.rest.request.RequestHeader;
2222

2323
import java.io.File;
2424
import java.util.ArrayList;
@@ -58,7 +58,7 @@ public class BasicConfiguration<SELF extends BasicConfiguration> implements Conf
5858
/**
5959
* Request interceptor.
6060
*/
61-
private RequestInterceptor requestInterceptor = new NoopRequestInterceptor();
61+
private final List<RequestInterceptor> requestInterceptors = new ArrayList<>();
6262

6363
/**
6464
* Request headers added to every request.
@@ -164,7 +164,7 @@ public SELF useRequestTimeoutInSeconds(final int requestTimeoutInSeconds) {
164164
* @return Configuration instance.
165165
*/
166166
public SELF useRequestInteceptor(final RequestInterceptor requestInterceptor) {
167-
this.requestInterceptor = Objects.requireNonNull(requestInterceptor);
167+
this.requestInterceptors.add(Objects.requireNonNull(requestInterceptor));
168168
return (SELF) this;
169169
}
170170

@@ -222,8 +222,8 @@ public ProxyConfiguration getProxyConfiguration() {
222222
}
223223

224224
@Override
225-
public RequestInterceptor getRequestInterceptor() {
226-
return requestInterceptor;
225+
public List<RequestInterceptor> getRequestInterceptors() {
226+
return requestInterceptors;
227227
}
228228

229229
@Override

src/main/java/org/sourcelab/http/rest/configuration/Configuration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.sourcelab.http.rest.configuration;
1919

2020
import org.sourcelab.http.rest.interceptor.RequestInterceptor;
21+
import org.sourcelab.http.rest.request.RequestHeader;
2122

2223
import java.io.File;
2324
import java.util.List;
@@ -98,7 +99,7 @@ public interface Configuration {
9899
* Implementation for intercepting requests.
99100
* @return instance.
100101
*/
101-
RequestInterceptor getRequestInterceptor();
102+
List<RequestInterceptor> getRequestInterceptors();
102103

103104
/**
104105
* Immutable list of request headers to be sent with every request.

0 commit comments

Comments
 (0)