Skip to content

Commit 5faf2ed

Browse files
dark2momobclozel
authored andcommitted
Fix missing Partitioned cookie support in reactive HTTP clients
This commit adds support for the Partitioned cookie attribute in the reactive HTTP clients that support this: Reactor and HttpComponents. Closes gh-34521 Signed-off-by: Rhett CfZhuang <dark.momo985@gmail.com> [brian.clozel@broadcom.com: rework tests and support HttpComponents] Signed-off-by: Brian Clozel <brian.clozel@broadcom.com>
1 parent d2733ce commit 5faf2ed

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsClientHttpResponse.java

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ private static MultiValueMap<String, ResponseCookie> adaptCookies(
9090
.maxAge(getMaxAgeSeconds(cookie))
9191
.secure(cookie.isSecure())
9292
.httpOnly(cookie.containsAttribute("httponly"))
93+
.partitioned(cookie.containsAttribute("partitioned"))
9394
.sameSite(cookie.getAttribute("samesite"))
9495
.build());
9596
}

spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpResponse.java

+8
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ public MultiValueMap<String, ResponseCookie> getCookies() {
148148
.secure(cookie.isSecure())
149149
.httpOnly(cookie.isHttpOnly())
150150
.sameSite(getSameSite(cookie))
151+
.partitioned(getPartitioned(cookie))
151152
.build()));
152153
return CollectionUtils.unmodifiableMultiValueMap(result);
153154
}
@@ -160,6 +161,13 @@ private static String getSameSite(Cookie cookie) {
160161
return null;
161162
}
162163

164+
private static boolean getPartitioned(Cookie cookie) {
165+
if (cookie instanceof DefaultCookie defaultCookie) {
166+
return defaultCookie.isPartitioned();
167+
}
168+
return false;
169+
}
170+
163171
/**
164172
* Called by {@link ReactorClientHttpConnector} when a cancellation is detected
165173
* but the content has not been subscribed to. If the subscription never

spring-web/src/test/java/org/springframework/http/client/reactive/ClientHttpConnectorTests.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -41,6 +41,7 @@
4141
import okio.Buffer;
4242
import org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder;
4343
import org.junit.jupiter.api.AfterEach;
44+
import org.junit.jupiter.api.Assumptions;
4445
import org.junit.jupiter.api.BeforeEach;
4546
import org.junit.jupiter.api.Named;
4647
import org.junit.jupiter.api.Test;
@@ -201,6 +202,25 @@ void cookieExpireValueSetAsMaxAge(ClientHttpConnector connector) {
201202
.verifyComplete();
202203
}
203204

205+
@ParameterizedConnectorTest
206+
void partitionedCookieSupport(ClientHttpConnector connector) {
207+
Assumptions.assumeFalse(connector instanceof JettyClientHttpConnector, "Jetty client does not support partitioned cookies");
208+
Assumptions.assumeFalse(connector instanceof JdkClientHttpConnector, "JDK client does not support partitioned cookies");
209+
prepareResponse(response -> {
210+
response.setResponseCode(200);
211+
response.addHeader("Set-Cookie", "id=test; Partitioned;");
212+
});
213+
Mono<ClientHttpResponse> futureResponse =
214+
connector.connect(HttpMethod.GET, this.server.url("/").uri(), ReactiveHttpOutputMessage::setComplete);
215+
StepVerifier.create(futureResponse)
216+
.assertNext(response -> {
217+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
218+
assertThat(response.getCookies().getFirst("id").isPartitioned()).isTrue();
219+
}
220+
)
221+
.verifyComplete();
222+
}
223+
204224
@Test
205225
void disableCookieWithHttpComponents() {
206226
ClientHttpConnector connector = new HttpComponentsClientHttpConnector(

0 commit comments

Comments
 (0)