Skip to content

Commit d5a8336

Browse files
pickypghyperxpro
andauthored
[CookieStore] Only set Cookies if they are not already set (#2033)
This changes the behavior of the automatic usage of the `CookieStore` to avoid overwriting already-set `Cookie`s and, instead only sets them if they do not exist yet. Closes #1964 Co-authored-by: Aayush Atharva <[email protected]>
1 parent 2af2715 commit d5a8336

File tree

4 files changed

+55
-9
lines changed

4 files changed

+55
-9
lines changed

client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClient.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public <T> ListenableFuture<T> executeRequest(Request request, AsyncHandler<T> h
235235
if (!cookies.isEmpty()) {
236236
RequestBuilder requestBuilder = request.toBuilder();
237237
for (Cookie cookie : cookies) {
238-
requestBuilder.addOrReplaceCookie(cookie);
238+
requestBuilder.addCookieIfUnset(cookie);
239239
}
240240
request = requestBuilder.build();
241241
}

client/src/main/java/org/asynchttpclient/RequestBuilderBase.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,21 @@ public T addCookie(Cookie cookie) {
323323
* @return this
324324
*/
325325
public T addOrReplaceCookie(Cookie cookie) {
326+
return maybeAddOrReplaceCookie(cookie, true);
327+
}
328+
329+
/**
330+
* Add a cookie based on its name, if it does not exist yet. Cookies that
331+
* are already set will be ignored.
332+
*
333+
* @param cookie the new cookie
334+
* @return this
335+
*/
336+
public T addCookieIfUnset(Cookie cookie) {
337+
return maybeAddOrReplaceCookie(cookie, false);
338+
}
339+
340+
private T maybeAddOrReplaceCookie(Cookie cookie, boolean allowReplace) {
326341
String cookieKey = cookie.name();
327342
boolean replace = false;
328343
int index = 0;
@@ -335,10 +350,10 @@ public T addOrReplaceCookie(Cookie cookie) {
335350

336351
index++;
337352
}
338-
if (replace) {
339-
cookies.set(index, cookie);
340-
} else {
353+
if (!replace) {
341354
cookies.add(cookie);
355+
} else if (allowReplace) {
356+
cookies.set(index, cookie);
342357
}
343358
return asDerivedType();
344359
}

client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,8 @@ public boolean exitAfterHandlingRedirect(Channel channel, NettyResponseFuture<?>
142142
CookieStore cookieStore = config.getCookieStore();
143143
if (cookieStore != null) {
144144
// Update request's cookies assuming that cookie store is already updated by Interceptors
145-
List<Cookie> cookies = cookieStore.get(newUri);
146-
if (!cookies.isEmpty()) {
147-
for (Cookie cookie : cookies) {
148-
requestBuilder.addOrReplaceCookie(cookie);
149-
}
145+
for (Cookie cookie : cookieStore.get(newUri)) {
146+
requestBuilder.addCookieIfUnset(cookie);
150147
}
151148
}
152149

client/src/test/java/org/asynchttpclient/RequestBuilderTest.java

+34
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,40 @@ public void testAddOrReplaceCookies() {
166166
assertEquals(requestBuilder.cookies.size(), 2, "cookie size must be 2 after adding 1 more cookie i.e. cookie3");
167167
}
168168

169+
@RepeatedIfExceptionsTest(repeats = 5)
170+
public void testAddIfUnsetCookies() {
171+
RequestBuilder requestBuilder = new RequestBuilder();
172+
Cookie cookie = new DefaultCookie("name", "value");
173+
cookie.setDomain("google.com");
174+
cookie.setPath("/");
175+
cookie.setMaxAge(1000);
176+
cookie.setSecure(true);
177+
cookie.setHttpOnly(true);
178+
requestBuilder.addCookieIfUnset(cookie);
179+
assertEquals(requestBuilder.cookies.size(), 1, "cookies size should be 1 after adding one cookie");
180+
assertEquals(requestBuilder.cookies.get(0), cookie, "cookie does not match");
181+
182+
Cookie cookie2 = new DefaultCookie("name", "value");
183+
cookie2.setDomain("google2.com");
184+
cookie2.setPath("/path");
185+
cookie2.setMaxAge(1001);
186+
cookie2.setSecure(false);
187+
cookie2.setHttpOnly(false);
188+
189+
requestBuilder.addCookieIfUnset(cookie2);
190+
assertEquals(requestBuilder.cookies.size(), 1, "cookies size should remain 1 as we just ignored cookie2 because of a cookie with same name");
191+
assertEquals(requestBuilder.cookies.get(0), cookie, "cookie does not match");
192+
193+
Cookie cookie3 = new DefaultCookie("name2", "value");
194+
cookie3.setDomain("google.com");
195+
cookie3.setPath("/");
196+
cookie3.setMaxAge(1000);
197+
cookie3.setSecure(true);
198+
cookie3.setHttpOnly(true);
199+
requestBuilder.addCookieIfUnset(cookie3);
200+
assertEquals(requestBuilder.cookies.size(), 2, "cookie size must be 2 after adding 1 more cookie i.e. cookie3");
201+
}
202+
169203
@RepeatedIfExceptionsTest(repeats = 5)
170204
public void testSettingQueryParamsBeforeUrlShouldNotProduceNPE() {
171205
RequestBuilder requestBuilder = new RequestBuilder();

0 commit comments

Comments
 (0)