Skip to content

Commit bc2257a

Browse files
committed
Invoke defaultRequest earlier in RestClient and WebClient
Closes gh-32053
1 parent 218957f commit bc2257a

File tree

4 files changed

+50
-8
lines changed

4 files changed

+50
-8
lines changed

spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,11 @@ public RequestBodyUriSpec method(HttpMethod method) {
181181
}
182182

183183
private RequestBodyUriSpec methodInternal(HttpMethod httpMethod) {
184-
return new DefaultRequestBodyUriSpec(httpMethod);
184+
DefaultRequestBodyUriSpec spec = new DefaultRequestBodyUriSpec(httpMethod);
185+
if (this.defaultRequest != null) {
186+
this.defaultRequest.accept(spec);
187+
}
188+
return spec;
185189
}
186190

187191
@Override
@@ -456,9 +460,6 @@ private <T> T exchangeInternal(ExchangeFunction<T> exchangeFunction, boolean clo
456460
Observation observation = null;
457461
URI uri = null;
458462
try {
459-
if (DefaultRestClient.this.defaultRequest != null) {
460-
DefaultRestClient.this.defaultRequest.accept(this);
461-
}
462463
uri = initUri();
463464
HttpHeaders headers = initHeaders();
464465
ClientHttpRequest clientRequest = createRequest(uri);

spring-web/src/test/java/org/springframework/web/client/RestClientIntegrationTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,29 @@ void defaultRequest(ClientHttpRequestFactory requestFactory) {
900900
expectRequest(request -> assertThat(request.getHeader("foo")).isEqualTo("bar"));
901901
}
902902

903+
@ParameterizedRestClientTest
904+
void defaultRequestOverride(ClientHttpRequestFactory requestFactory) {
905+
startServer(requestFactory);
906+
907+
prepareResponse(response -> response.setHeader("Content-Type", "text/plain")
908+
.setBody("Hello Spring!"));
909+
910+
RestClient headersClient = this.restClient.mutate()
911+
.defaultRequest(request -> request.accept(MediaType.APPLICATION_JSON))
912+
.build();
913+
914+
String result = headersClient.get()
915+
.uri("/greeting")
916+
.accept(MediaType.TEXT_PLAIN)
917+
.retrieve()
918+
.body(String.class);
919+
920+
assertThat(result).isEqualTo("Hello Spring!");
921+
922+
expectRequestCount(1);
923+
expectRequest(request -> assertThat(request.getHeader("Accept")).isEqualTo(MediaType.TEXT_PLAIN_VALUE));
924+
}
925+
903926

904927
private void prepareResponse(Consumer<MockResponse> consumer) {
905928
MockResponse response = new MockResponse();

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,11 @@ public RequestBodyUriSpec method(HttpMethod httpMethod) {
177177
}
178178

179179
private RequestBodyUriSpec methodInternal(HttpMethod httpMethod) {
180-
return new DefaultRequestBodyUriSpec(httpMethod);
180+
DefaultRequestBodyUriSpec spec = new DefaultRequestBodyUriSpec(httpMethod);
181+
if (this.defaultRequest != null) {
182+
this.defaultRequest.accept(spec);
183+
}
184+
return spec;
181185
}
182186

183187
@Override
@@ -479,9 +483,6 @@ public Mono<ClientResponse> exchange() {
479483
}
480484

481485
private ClientRequest.Builder initRequestBuilder() {
482-
if (defaultRequest != null) {
483-
defaultRequest.accept(this);
484-
}
485486
ClientRequest.Builder builder = ClientRequest.create(this.httpMethod, initUri())
486487
.headers(this::initHeaders)
487488
.cookies(this::initCookies)

spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java

+17
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,23 @@ private void testStatusHandlerForToEntity(Publisher<?> responsePublisher) {
528528
StepVerifier.create(responsePublisher).expectError(WebClientResponseException.class).verify();
529529
}
530530

531+
@Test // gh-32053
532+
void defaultRequestOverride() {
533+
WebClient client = this.builder
534+
.defaultRequest(spec -> spec.accept(MediaType.APPLICATION_JSON))
535+
.build();
536+
537+
client.get().uri("/path")
538+
.accept(MediaType.IMAGE_PNG)
539+
.retrieve()
540+
.bodyToMono(Void.class)
541+
.block(Duration.ofSeconds(3));
542+
543+
ClientRequest request = verifyAndGetRequest();
544+
assertThat(request.headers().getAccept()).containsExactly(MediaType.IMAGE_PNG);
545+
}
546+
547+
531548

532549
private ClientRequest verifyAndGetRequest() {
533550
ClientRequest request = this.captor.getValue();

0 commit comments

Comments
 (0)