Skip to content

Commit

Permalink
Copy default headers, cookies in WebClient builder
Browse files Browse the repository at this point in the history
This commit makes copies of the default headers and cookies when a
WebClient is built, so that subsequent changes to these do not affect
previously built clients.

Closes: spring-projectsgh-25992
  • Loading branch information
poutsma committed Oct 29, 2020
1 parent a9dec6a commit 0acb1e5
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -263,9 +263,14 @@ public WebClient build() {
.reduce(ExchangeFilterFunction::andThen)
.map(filter -> filter.apply(exchange))
.orElse(exchange) : exchange);

HttpHeaders defaultHeaders = copyDefaultHeaders();

MultiValueMap<String, String> defaultCookies = copyDefaultCookies();

return new DefaultWebClient(filteredExchange, initUriBuilderFactory(),
this.defaultHeaders != null ? HttpHeaders.readOnlyHttpHeaders(this.defaultHeaders) : null,
this.defaultCookies != null ? CollectionUtils.unmodifiableMultiValueMap(this.defaultCookies) : null,
defaultHeaders,
defaultCookies,
this.defaultRequest, new DefaultWebClientBuilder(this));
}

Expand Down Expand Up @@ -302,4 +307,28 @@ private UriBuilderFactory initUriBuilderFactory() {
return factory;
}

@Nullable
private HttpHeaders copyDefaultHeaders() {
if (this.defaultHeaders != null) {
HttpHeaders copy = new HttpHeaders();
this.defaultHeaders.forEach((key, values) -> copy.put(key, new ArrayList<>(values)));
return HttpHeaders.readOnlyHttpHeaders(copy);
}
else {
return null;
}
}

@Nullable
private MultiValueMap<String, String> copyDefaultCookies() {
if (this.defaultCookies != null) {
MultiValueMap<String, String> copy = new LinkedMultiValueMap<>(this.defaultCookies.size());
this.defaultCookies.forEach((key, values) -> copy.put(key, new ArrayList<>(values)));
return CollectionUtils.unmodifiableMultiValueMap(copy);
}
else {
return null;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@ public void requestHeaderAndCookie() {
@Test
public void defaultHeaderAndCookie() {
WebClient client = this.builder
.defaultHeader("Accept", "application/json").defaultCookie("id", "123")
.defaultHeader("Accept", "application/json")
.defaultCookie("id", "123")
.build();

client.get().uri("/path").exchange().block(Duration.ofSeconds(10));
Expand All @@ -157,6 +158,35 @@ public void defaultHeaderAndCookieOverrides() {
assertThat(request.cookies().getFirst("id")).isEqualTo("456");
}

@Test
public void defaultHeaderAndCookieCopies() {
WebClient client1 = this.builder
.defaultHeader("Accept", "application/json")
.defaultCookie("id", "123")
.build();
WebClient client2 = this.builder
.defaultHeader("Accept", "application/xml")
.defaultCookies(cookies -> cookies.set("id", "456"))
.build();

client1.get().uri("/path")
.exchange().block(Duration.ofSeconds(10));

ClientRequest request = verifyAndGetRequest();
assertThat(request.headers().getFirst("Accept")).isEqualTo("application/json");
assertThat(request.cookies().getFirst("id")).isEqualTo("123");


client2.get().uri("/path")
.exchange().block(Duration.ofSeconds(10));

request = verifyAndGetRequest();
assertThat(request.headers().getFirst("Accept")).isEqualTo("application/xml");
assertThat(request.cookies().getFirst("id")).isEqualTo("456");


}

@Test
public void defaultRequest() {
ThreadLocal<String> context = new NamedThreadLocal<>("foo");
Expand Down

0 comments on commit 0acb1e5

Please sign in to comment.