4747import org .slf4j .LoggerFactory ;
4848import org .sourcelab .http .rest .configuration .Configuration ;
4949import org .sourcelab .http .rest .configuration .ProxyConfiguration ;
50- import org .sourcelab .http .rest .configuration .RequestHeader ;
50+ import org .sourcelab .http .rest .request .RequestHeader ;
5151import org .sourcelab .http .rest .exceptions .ConnectionException ;
5252import org .sourcelab .http .rest .exceptions .ResultParsingException ;
5353import org .sourcelab .http .rest .handlers .RestResponseHandler ;
54+ import org .sourcelab .http .rest .interceptor .HeaderRequestInterceptor ;
5455import org .sourcelab .http .rest .interceptor .RequestContext ;
5556import org .sourcelab .http .rest .interceptor .RequestInterceptor ;
5657import org .sourcelab .http .rest .request .Request ;
5758import 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
5963import javax .net .ssl .SSLHandshakeException ;
6064import java .io .IOException ;
6569import java .net .URL ;
6670import java .nio .charset .StandardCharsets ;
6771import java .util .ArrayList ;
68- import java .util .Collection ;
69- import java .util .Collections ;
7072import java .util .List ;
71- import java .util .Map ;
7273import java .util .concurrent .TimeUnit ;
7374
7475/**
7778public 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}
0 commit comments