From e8e4d90c5d1c7404c0995920763265532cb1d1b3 Mon Sep 17 00:00:00 2001 From: Aaron Rosser Date: Tue, 9 Jan 2024 23:32:58 +0000 Subject: [PATCH 1/2] Exclude URL query from checkpoint in DefaultWebClient --- .../function/client/DefaultWebClient.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index ccb57b713c00..97ee631b4df0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -195,6 +195,18 @@ private static Mono releaseIfNotConsumed(ClientResponse response, Throwab return response.releaseBody().onErrorComplete().then(Mono.error(ex)); } + private static URI getUriToLog(URI uri) { + if (StringUtils.hasText(uri.getQuery())) { + try { + uri = new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), null, null); + } + catch (URISyntaxException ex) { + // ignore + } + } + return uri; + } + private class DefaultRequestBodyUriSpec implements RequestBodyUriSpec { @@ -457,7 +469,7 @@ public Mono exchange() { observationContext.setRequest(request); Mono responseMono = filterFunction.apply(exchangeFunction) .exchange(request) - .checkpoint("Request to " + this.httpMethod.name() + " " + this.uri + " [DefaultWebClient]") + .checkpoint("Request to " + this.httpMethod.name() + " " + getUriToLog(request.url()) + " [DefaultWebClient]") .switchIfEmpty(NO_HTTP_CLIENT_RESPONSE_ERROR); if (this.contextModifier != null) { responseMono = responseMono.contextWrite(this.contextModifier); @@ -698,18 +710,6 @@ private Mono applyStatusHandlers(ClientResponse response) { return null; } - private static URI getUriToLog(URI uri) { - if (StringUtils.hasText(uri.getQuery())) { - try { - uri = new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), null, null); - } - catch (URISyntaxException ex) { - // ignore - } - } - return uri; - } - private static class StatusHandler { From e6fe1306de5efacca8655ba8c7938d4b468f856e Mon Sep 17 00:00:00 2001 From: Aaron Rosser Date: Tue, 9 Jan 2024 23:35:54 +0000 Subject: [PATCH 2/2] Exclude URL query from WebClientResponseException --- .../client/WebClientResponseException.java | 17 ++++++++++- .../client/DefaultClientResponseTests.java | 28 +++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientResponseException.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientResponseException.java index 360adb44baf1..eff36f2dd3ed 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientResponseException.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClientResponseException.java @@ -16,6 +16,8 @@ package org.springframework.web.reactive.function.client; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.List; @@ -30,6 +32,7 @@ import org.springframework.http.HttpStatusCode; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; /** * Exceptions that contain actual HTTP response data. @@ -99,7 +102,19 @@ public WebClientResponseException( private static String initMessage(HttpStatusCode status, String reasonPhrase, @Nullable HttpRequest request) { return status.value() + " " + reasonPhrase + - (request != null ? " from " + request.getMethod() + " " + request.getURI() : ""); + (request != null ? " from " + request.getMethod() + " " + getUriToLog(request.getURI()) : ""); + } + + private static URI getUriToLog(URI uri) { + if (StringUtils.hasText(uri.getQuery())) { + try { + uri = new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), null, null); + } + catch (URISyntaxException ex) { + // ignore + } + } + return uri; } /** diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java index 58c1d7735602..ea90ef6e8238 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientResponseTests.java @@ -17,6 +17,7 @@ package org.springframework.web.reactive.function.client; import java.net.InetSocketAddress; +import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -34,7 +35,9 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpRange; +import org.springframework.http.HttpRequest; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; @@ -43,6 +46,7 @@ import org.springframework.http.client.reactive.ClientHttpResponse; import org.springframework.http.codec.DecoderHttpMessageReader; import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -67,13 +71,16 @@ class DefaultClientResponseTests { private final ExchangeStrategies mockExchangeStrategies = mock(); + @Nullable + private HttpRequest httpRequest = null; + private DefaultClientResponse defaultClientResponse; @BeforeEach void configureMocks() { given(mockResponse.getHeaders()).willReturn(this.httpHeaders); - defaultClientResponse = new DefaultClientResponse(mockResponse, mockExchangeStrategies, "", "", () -> null); + defaultClientResponse = new DefaultClientResponse(mockResponse, mockExchangeStrategies, "", "", () -> httpRequest); } @@ -302,13 +309,30 @@ void createException() { given(mockResponse.getStatusCode()).willReturn(HttpStatus.NOT_FOUND); given(mockResponse.getBody()).willReturn(Flux.just(dataBuffer)); + httpRequest = new HttpRequest() { + @Override + public HttpMethod getMethod() { + return HttpMethod.valueOf("UNKNOWN"); + } + + @Override + public URI getURI() { + return URI.create("https://user:pass@example.org:9999/app/path?token=secret#fragment"); + } + + @Override + public HttpHeaders getHeaders() { + return HttpHeaders.EMPTY; + } + }; + given(mockExchangeStrategies.messageReaders()).willReturn( List.of(new DecoderHttpMessageReader<>(new ByteArrayDecoder()))); Mono resultMono = defaultClientResponse.createException(); WebClientResponseException exception = resultMono.block(); assertThat(exception.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); - assertThat(exception.getMessage()).isEqualTo("404 Not Found"); + assertThat(exception.getMessage()).isEqualTo("404 Not Found from UNKNOWN https://example.org:9999/app/path"); assertThat(exception.getHeaders()).containsExactly(entry("Content-Type", List.of("text/plain"))); assertThat(exception.getResponseBodyAsByteArray()).isEqualTo(bytes); }