This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2077a971d41caaacaf45a0f86cdc791c446f5261 Author: Otavio Rodolfo Piske <angusyo...@gmail.com> AuthorDate: Sun May 12 09:16:55 2024 +0200 (chores) camel-http: code cleanup - break large and complex methods --- .../http/HttpComponentVerifierExtension.java | 120 ++++++++++++--------- .../apache/camel/component/http/HttpMethods.java | 11 +- .../apache/camel/component/http/HttpProducer.java | 62 ++++++----- 3 files changed, 105 insertions(+), 88 deletions(-) diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponentVerifierExtension.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponentVerifierExtension.java index 6db0e36c1f8..ab7e6a5ebc6 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponentVerifierExtension.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponentVerifierExtension.java @@ -32,6 +32,8 @@ import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; final class HttpComponentVerifierExtension extends DefaultComponentVerifierExtension { @@ -51,15 +53,7 @@ final class HttpComponentVerifierExtension extends DefaultComponentVerifierExten // Make a copy to avoid clashing with parent validation final HashMap<String, Object> verifyParams = new HashMap<>(parameters); // Check if validation is rest-related - final boolean isRest = verifyParams.entrySet().stream().anyMatch(HttpComponentVerifierExtension::isRest); - - if (isRest) { - // Build the httpUri from rest configuration - verifyParams.put("httpUri", buildHttpUriFromRestParameters(parameters)); - - // Cleanup parameters map from rest related stuffs - verifyParams.entrySet().removeIf(HttpComponentVerifierExtension::isRest); - } + restRelatedSetup(parameters, verifyParams); // Validate using the catalog super.verifyParametersAgainstCatalog(builder, verifyParams); @@ -78,16 +72,7 @@ final class HttpComponentVerifierExtension extends DefaultComponentVerifierExten = ResultBuilder.withStatusAndScope(Result.Status.OK, ComponentVerifierExtension.Scope.CONNECTIVITY); // Make a copy to avoid clashing with parent validation final HashMap<String, Object> verifyParams = new HashMap<>(parameters); - // Check if validation is rest-related - final boolean isRest = verifyParams.entrySet().stream().anyMatch(HttpComponentVerifierExtension::isRest); - - if (isRest) { - // Build the httpUri from rest configuration - verifyParams.put("httpUri", buildHttpUriFromRestParameters(parameters)); - - // Cleanup parameters from rest related stuffs - verifyParams.entrySet().removeIf(HttpComponentVerifierExtension::isRest); - } + final boolean isRest = restRelatedSetup(parameters, verifyParams); String httpUri = getOption(verifyParams, "httpUri", String.class).orElse(null); if (ObjectHelper.isEmpty(httpUri)) { @@ -100,39 +85,7 @@ final class HttpComponentVerifierExtension extends DefaultComponentVerifierExten try (CloseableHttpClient httpclient = createHttpClient(verifyParams)) { httpclient.execute( new HttpGet(httpUri), - response -> { - int code = response.getCode(); - String okCodes = getOption(verifyParams, "okStatusCodeRange", String.class).orElse("200-299"); - - if (!HttpHelper.isStatusCodeOk(code, okCodes)) { - if (code == 401) { - // Unauthorized, add authUsername and authPassword to the list - // of parameters in error - builder.error( - ResultErrorBuilder.withHttpCode(code) - .description(response.getReasonPhrase()) - .parameterKey("authUsername") - .parameterKey("authPassword") - .build()); - } else if (code >= 300 && code < 400) { - // redirect - builder.error( - ResultErrorBuilder.withHttpCode(code) - .description(response.getReasonPhrase()) - .parameterKey("httpUri") - .detail(VerificationError.HttpAttribute.HTTP_REDIRECT, - () -> HttpUtil.responseHeaderValue(response, "location")) - .build()); - } else if (code >= 400) { - // generic http error - builder.error( - ResultErrorBuilder.withHttpCode(code) - .description(response.getReasonPhrase()) - .build()); - } - } - return null; - }); + createObjectHttpClientResponseHandler(verifyParams, builder)); } catch (UnknownHostException e) { builder.error( @@ -146,6 +99,69 @@ final class HttpComponentVerifierExtension extends DefaultComponentVerifierExten return builder.build(); } + private HttpClientResponseHandler<Object> createObjectHttpClientResponseHandler( + HashMap<String, Object> verifyParams, ResultBuilder builder) { + return response -> { + int code = response.getCode(); + String okCodes = getOption(verifyParams, "okStatusCodeRange", String.class).orElse("200-299"); + + if (!HttpHelper.isStatusCodeOk(code, okCodes)) { + if (code == 401) { + setupUnauthorizedRespose(builder, response, code); + } else if (code >= 300 && code < 400) { + setupRedirect(builder, response, code); + } else if (code >= 400) { + setupOtherHttpErrors(builder, response, code); + } + } + return null; + }; + } + + private static void setupOtherHttpErrors(ResultBuilder builder, ClassicHttpResponse response, int code) { + // generic http error + builder.error( + ResultErrorBuilder.withHttpCode(code) + .description(response.getReasonPhrase()) + .build()); + } + + private static void setupRedirect(ResultBuilder builder, ClassicHttpResponse response, int code) { + // redirect + builder.error( + ResultErrorBuilder.withHttpCode(code) + .description(response.getReasonPhrase()) + .parameterKey("httpUri") + .detail(VerificationError.HttpAttribute.HTTP_REDIRECT, + () -> HttpUtil.responseHeaderValue(response, "location")) + .build()); + } + + private static void setupUnauthorizedRespose(ResultBuilder builder, ClassicHttpResponse response, int code) { + // Unauthorized, add authUsername and authPassword to the list + // of parameters in error + builder.error( + ResultErrorBuilder.withHttpCode(code) + .description(response.getReasonPhrase()) + .parameterKey("authUsername") + .parameterKey("authPassword") + .build()); + } + + private boolean restRelatedSetup(Map<String, Object> parameters, HashMap<String, Object> verifyParams) { + // Check if validation is rest-related + final boolean isRest = verifyParams.entrySet().stream().anyMatch(HttpComponentVerifierExtension::isRest); + + if (isRest) { + // Build the httpUri from rest configuration + verifyParams.put("httpUri", buildHttpUriFromRestParameters(parameters)); + + // Cleanup parameters from rest related stuffs + verifyParams.entrySet().removeIf(HttpComponentVerifierExtension::isRest); + } + return isRest; + } + private static boolean isRest(Map.Entry<String, Object> e) { return e.getKey().startsWith("rest."); } diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMethods.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMethods.java index b2f847d0136..efda890b7ac 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMethods.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMethods.java @@ -49,16 +49,7 @@ public enum HttpMethods implements Expression { } public HttpUriRequest createMethod(final String url) { - return switch (this) { - case GET -> new HttpGet(url); - case PATCH -> new HttpPatch(url); - case POST -> new HttpPost(url); - case PUT -> new HttpPut(url); - case DELETE -> new HttpDelete(url); - case HEAD -> new HttpHead(url); - case OPTIONS -> new HttpOptions(url); - case TRACE -> new HttpTrace(url); - }; + return createMethod(URI.create(url)); } public HttpUriRequest createMethod(final URI uri) { diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java index 4bd16f77a21..78e6b4aedd0 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java @@ -348,17 +348,7 @@ public class HttpProducer extends DefaultProducer { throws IOException, ClassNotFoundException { // We just make the out message is not create when extractResponseBody throws exception Object response = extractResponseBody(httpResponse, exchange, getEndpoint().isIgnoreResponseBody()); - Message answer = exchange.getOut(); - - // optimize for 200 response code as the boxing is outside the cached integers - if (responseCode == 200) { - answer.setHeader(HttpConstants.HTTP_RESPONSE_CODE, OK_RESPONSE_CODE); - } else { - answer.setHeader(HttpConstants.HTTP_RESPONSE_CODE, responseCode); - } - if (httpResponse.getReasonPhrase() != null) { - answer.setHeader(HttpConstants.HTTP_RESPONSE_TEXT, httpResponse.getReasonPhrase()); - } + final Message answer = createResponseMessage(exchange, httpResponse, responseCode); answer.setBody(response); if (!getEndpoint().isSkipResponseHeaders()) { @@ -409,6 +399,21 @@ public class HttpProducer extends DefaultProducer { } } + private static Message createResponseMessage(Exchange exchange, ClassicHttpResponse httpResponse, int responseCode) { + Message answer = exchange.getOut(); + + // optimize for 200 response code as the boxing is outside the cached integers + if (responseCode == 200) { + answer.setHeader(HttpConstants.HTTP_RESPONSE_CODE, OK_RESPONSE_CODE); + } else { + answer.setHeader(HttpConstants.HTTP_RESPONSE_CODE, responseCode); + } + if (httpResponse.getReasonPhrase() != null) { + answer.setHeader(HttpConstants.HTTP_RESPONSE_TEXT, httpResponse.getReasonPhrase()); + } + return answer; + } + protected Exception populateHttpOperationFailedException( Exchange exchange, HttpUriRequest httpRequest, ClassicHttpResponse httpResponse, int responseCode) throws IOException, ClassNotFoundException { @@ -624,21 +629,7 @@ public class HttpProducer extends DefaultProducer { // the exchange can have some headers that override the default url and forces to create // a new url that is dynamic based on header values // these checks are checks that is done in HttpHelper.createURL and HttpHelper.createURI methods - boolean create = false; - Message in = exchange.getIn(); - if (in.getHeader(HttpConstants.REST_HTTP_URI) != null) { - create = true; - } else if (in.getHeader(HttpConstants.HTTP_URI) != null && !getEndpoint().isBridgeEndpoint()) { - create = true; - } else if (in.getHeader(HttpConstants.HTTP_PATH) != null) { - create = true; - } else if (in.getHeader(HttpConstants.REST_HTTP_QUERY) != null) { - create = true; - } else if (in.getHeader(HttpConstants.HTTP_RAW_QUERY) != null) { - create = true; - } else if (in.getHeader(HttpConstants.HTTP_QUERY) != null) { - create = true; - } + final boolean create = isCreateNewURL(exchange); if (create) { // creating the url to use takes 2-steps @@ -679,6 +670,25 @@ public class HttpProducer extends DefaultProducer { return method; } + private boolean isCreateNewURL(Exchange exchange) { + boolean create = false; + Message in = exchange.getIn(); + if (in.getHeader(HttpConstants.REST_HTTP_URI) != null) { + create = true; + } else if (in.getHeader(HttpConstants.HTTP_URI) != null && !getEndpoint().isBridgeEndpoint()) { + create = true; + } else if (in.getHeader(HttpConstants.HTTP_PATH) != null) { + create = true; + } else if (in.getHeader(HttpConstants.REST_HTTP_QUERY) != null) { + create = true; + } else if (in.getHeader(HttpConstants.HTTP_RAW_QUERY) != null) { + create = true; + } else if (in.getHeader(HttpConstants.HTTP_QUERY) != null) { + create = true; + } + return create; + } + /** * Creates a holder object for the data to send to the remote server. *