Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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 <aayush@shieldblaze.com>
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‎

Lines changed: 1 addition & 1 deletion
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‎

Lines changed: 18 additions & 3 deletions
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‎

Lines changed: 2 additions & 5 deletions
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‎

Lines changed: 34 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /