From a78352f5d1b9dcd087385dd526aaf78dbf686385 Mon Sep 17 00:00:00 2001 From: Nishant Sehgal Date: Tue, 3 Oct 2023 15:26:24 +0530 Subject: [PATCH] feat: fix hard coded status code in response --- .../client/CommonSpringWebClient.java | 87 ++++++++++--------- .../client/CommonSpringWebClientTest.java | 8 +- 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/intuit/springwebclient/client/CommonSpringWebClient.java b/src/main/java/com/intuit/springwebclient/client/CommonSpringWebClient.java index ce0668c..7890de3 100644 --- a/src/main/java/com/intuit/springwebclient/client/CommonSpringWebClient.java +++ b/src/main/java/com/intuit/springwebclient/client/CommonSpringWebClient.java @@ -1,25 +1,28 @@ package com.intuit.springwebclient.client; -import com.intuit.springwebclient.entity.ClientHttpRequest; -import com.intuit.springwebclient.entity.ClientHttpResponse; -import com.intuit.springwebclient.retryHandler.RetryHandlerFactory; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.time.Duration; +import java.util.Objects; +import java.util.function.Consumer; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.UnknownContentTypeException; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient.RequestBodySpec; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import com.intuit.springwebclient.entity.ClientHttpRequest; +import com.intuit.springwebclient.entity.ClientHttpResponse; +import com.intuit.springwebclient.retryHandler.RetryHandlerFactory; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; -import java.time.Duration; -import java.util.Objects; -import java.util.function.Consumer; - /** * Spring 5 Web Client Method executor. */ @@ -37,16 +40,21 @@ public class CommonSpringWebClient { * @param */ public ClientHttpResponse syncHttpResponse(ClientHttpRequest httpRequest) { - try { - log.info("Executing http request for request={}, method={}", httpRequest.getUrl(), httpRequest.getHttpMethod()); - return generateResponse( - generateResponseSpec(httpRequest) - .bodyToMono(httpRequest.getResponseType()) - .retryWhen(generateRetrySpec(httpRequest)) - .block()); - } catch (final HttpStatusCodeException ex) { - final String errorMessage = String.format("Error in making rest call. Error=%s Headers=%s", - ex.getResponseBodyAsString(), ex.getResponseHeaders()); + try { + log.info("Executing http request for request={}, method={}", httpRequest.getUrl(), + httpRequest.getHttpMethod()); + return generateResponseSpec(httpRequest).toEntity(httpRequest.getResponseType()).map(resp -> { + return generateResponse(resp); + }).retryWhen(generateRetrySpec(httpRequest)).block(); + } + catch (final WebClientResponseException ex) { + final String errorMessage = String.format("Error in making rest call. Error=%s Headers=%s statusCode=%s", + ex.getResponseBodyAsString(), ex.getHeaders(), ex.getStatusCode()); + return handleException(ex, errorMessage, HttpStatus.valueOf(ex.getStatusCode().value()), httpRequest); + } + catch (final HttpStatusCodeException ex) { + final String errorMessage = String.format("Error in making rest call. Error=%s Headers=%s statusCode=%s", + ex.getResponseBodyAsString(), ex.getResponseHeaders(),ex.getStatusCode()); return handleException(ex, errorMessage, HttpStatus.valueOf(ex.getStatusCode().value()), httpRequest); } catch (final UnknownContentTypeException ex) { // It was observed that this exception was thrown whenever there was a HTTP 5XX error @@ -90,25 +98,26 @@ private WebClient.ResponseSpec generateResponseSpec( * @param httpRequest * @return */ - private Retry generateRetrySpec(ClientHttpRequest httpRequest) { - return Retry.fixedDelay(httpRequest.getClientRetryConfig().getMaxAttempts(), Duration.ofSeconds(httpRequest.getClientRetryConfig().getBackOff())) - .doBeforeRetry(signal -> log.info("Retrying for request={}, retryCount={}", httpRequest.getUrl(), signal.totalRetries())) - .filter(httpRequest.getClientRetryConfig().getRetryFilter()); - } + private Retry generateRetrySpec(ClientHttpRequest httpRequest) { + return Retry + .fixedDelay(httpRequest.getClientRetryConfig().getMaxAttempts(), + Duration.ofSeconds(httpRequest.getClientRetryConfig().getBackOff())) + .doBeforeRetry(signal -> log.info("Retrying for request={}, retryCount={}", httpRequest.getUrl(), + signal.totalRetries())) + .filter(httpRequest.getClientRetryConfig().getRetryFilter()); + } - /** - * Handle Success response. - * @param response - * @return - * @param - */ - private ClientHttpResponse generateResponse(RESPONSE response) { - return ClientHttpResponse.builder() - .response(response) - .status(HttpStatus.OK) - .isSuccess2xx(HttpStatus.OK.is2xxSuccessful()) - .build(); - } + /** + * Handle Success response. + * + * @param response + * @return + * @param + */ + private ClientHttpResponse generateResponse(ResponseEntity response) { + return ClientHttpResponse.builder().response(response.getBody()).status(response.getStatusCode()) + .isSuccess2xx(response.getStatusCode().is2xxSuccessful()).build(); + } /** * Handle Exception and send back response. @@ -119,11 +128,11 @@ private ClientHttpResponse generateResponse(RESPONSE respon * @return * @param */ - private ClientHttpResponse handleException( + private ClientHttpResponse handleException( final Exception exception, final String errorMessage, final HttpStatus httpStatus, - final ClientHttpRequest httpRequest) { + final ClientHttpRequest httpRequest) { log.error("Exception while executing http request for request={}, status={}, errorMessage={}", httpRequest.getUrl(), httpStatus, errorMessage); httpRequest.getRetryHandlers() .forEach(handlerId -> RetryHandlerFactory.getHandler(handlerId.toString()).checkAndThrowRetriableException(exception)); diff --git a/src/test/java/com/intuit/springwebclient/client/CommonSpringWebClientTest.java b/src/test/java/com/intuit/springwebclient/client/CommonSpringWebClientTest.java index 5c270b2..c6ae0dc 100644 --- a/src/test/java/com/intuit/springwebclient/client/CommonSpringWebClientTest.java +++ b/src/test/java/com/intuit/springwebclient/client/CommonSpringWebClientTest.java @@ -1,7 +1,6 @@ package com.intuit.springwebclient.client; -import com.intuit.springwebclient.entity.ClientHttpRequest; -import com.intuit.springwebclient.entity.ClientHttpRequest.ClientHttpRequestBuilder; +import java.util.function.Consumer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -16,8 +15,11 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.UnknownContentTypeException; import org.springframework.web.reactive.function.client.WebClient; + +import com.intuit.springwebclient.entity.ClientHttpRequest; +import com.intuit.springwebclient.entity.ClientHttpRequest.ClientHttpRequestBuilder; + import reactor.core.publisher.Mono; -import java.util.function.Consumer; @ExtendWith(MockitoExtension.class)