Return the best match in the cookie list

The cookies for a domain could contain two or more cookies for the same
domain, but with different paths. We now return the best matching cookie
only and not all.
This commit is contained in:
0xb00bface 2021-04-11 13:22:24 +02:00
parent 5293affe4d
commit 4c1b311559
1 changed files with 38 additions and 14 deletions

View File

@ -1,6 +1,7 @@
package ctbrec.io;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -19,7 +20,7 @@ import okhttp3.HttpUrl;
public class CookieJarImpl implements CookieJar {
private static final transient Logger LOG = LoggerFactory.getLogger(CookieJarImpl.class);
private static final Logger LOG = LoggerFactory.getLogger(CookieJarImpl.class);
private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@ -28,7 +29,7 @@ public class CookieJarImpl implements CookieJar {
String host = getDomain(url);
List<Cookie> cookiesForUrl = cookieStore.get(host);
if (cookiesForUrl != null) {
cookiesForUrl = new ArrayList<Cookie>(cookiesForUrl); //unmodifiable
cookiesForUrl = new ArrayList<>(cookiesForUrl);
for (Iterator<Cookie> iterator = cookiesForUrl.iterator(); iterator.hasNext();) {
Cookie oldCookie = iterator.next();
String name = oldCookie.name();
@ -52,20 +53,48 @@ public class CookieJarImpl implements CookieJar {
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
LOG.debug("Loading cookies for {}", url);
String host = getDomain(url);
List<Cookie> cookies = cookieStore.get(host);
List<Cookie> result = new ArrayList<>();
if (cookies != null) {
for (Cookie cookie : cookies) {
addCookieToResult(url, result, cookie);
}
}
LOG.trace("Cookies for {}", url);
Optional.ofNullable(cookies).ifPresent(cookiez -> cookiez.forEach(c -> {
LOG.trace(" {} expires on:{}", c, c.expiresAt());
}));
//LOG.debug("Cookies for {}: {}", url.host(), cookies);
return cookies != null ? cookies : new ArrayList<Cookie>();
Optional.ofNullable(result).ifPresent(cookiez -> cookiez.forEach(c -> LOG.trace("Cookies for {}: {}", url, c)));
return result;
}
private void addCookieToResult(HttpUrl url, List<Cookie> result, Cookie cookie) {
Optional<Cookie> cookieFromResults = getCookieFromCollection(result, cookie.name());
if (cookieFromResults.isPresent()) {
if (cookie.path().length() > cookieFromResults.get().path().length()) {
String urlPath = String.join("/", url.pathSegments());
if (urlPath.contains(cookie.path())) {
result.remove(cookieFromResults.get());
result.add(cookie);
}
}
} else {
result.add(cookie);
}
}
public Optional<Cookie> getCookieFromCollection(Collection<Cookie> collection, String name) {
for (Cookie cookie : collection) {
if (Objects.equals(name, cookie.name())) {
return Optional.of(cookie);
}
}
return Optional.empty();
}
public Cookie getCookie(HttpUrl url, String name) {
List<Cookie> cookies = loadForRequest(url);
for (Cookie cookie : cookies) {
if(Objects.equals(cookie.name(), name)) {
if (Objects.equals(cookie.name(), name)) {
return cookie;
}
}
@ -78,7 +107,7 @@ public class CookieJarImpl implements CookieJar {
Cookie cookie = iterator.next();
if(Objects.equals(cookie.name(), name)) {
iterator.remove();
LOG.debug("Removed cookie \"{}\" for {}", name, url.toString());
LOG.debug("Removed cookie \"{}\" for {}", name, url);
return;
}
}
@ -86,11 +115,6 @@ public class CookieJarImpl implements CookieJar {
}
private String getDomain(HttpUrl url) {
// String host = url.host();
// if (host.startsWith("www.")) {
// host = host.substring(4);
// }
// return host;
return url.topPrivateDomain();
}