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; package ctbrec.io;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -19,7 +20,7 @@ import okhttp3.HttpUrl;
public class CookieJarImpl implements CookieJar { 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<>(); private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@ -28,7 +29,7 @@ public class CookieJarImpl implements CookieJar {
String host = getDomain(url); String host = getDomain(url);
List<Cookie> cookiesForUrl = cookieStore.get(host); List<Cookie> cookiesForUrl = cookieStore.get(host);
if (cookiesForUrl != null) { if (cookiesForUrl != null) {
cookiesForUrl = new ArrayList<Cookie>(cookiesForUrl); //unmodifiable cookiesForUrl = new ArrayList<>(cookiesForUrl);
for (Iterator<Cookie> iterator = cookiesForUrl.iterator(); iterator.hasNext();) { for (Iterator<Cookie> iterator = cookiesForUrl.iterator(); iterator.hasNext();) {
Cookie oldCookie = iterator.next(); Cookie oldCookie = iterator.next();
String name = oldCookie.name(); String name = oldCookie.name();
@ -52,20 +53,48 @@ public class CookieJarImpl implements CookieJar {
@Override @Override
public List<Cookie> loadForRequest(HttpUrl url) { public List<Cookie> loadForRequest(HttpUrl url) {
LOG.debug("Loading cookies for {}", url);
String host = getDomain(url); String host = getDomain(url);
List<Cookie> cookies = cookieStore.get(host); 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); LOG.trace("Cookies for {}", url);
Optional.ofNullable(cookies).ifPresent(cookiez -> cookiez.forEach(c -> { Optional.ofNullable(result).ifPresent(cookiez -> cookiez.forEach(c -> LOG.trace("Cookies for {}: {}", url, c)));
LOG.trace(" {} expires on:{}", c, c.expiresAt()); return result;
})); }
//LOG.debug("Cookies for {}: {}", url.host(), cookies);
return cookies != null ? cookies : new ArrayList<Cookie>(); 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) { public Cookie getCookie(HttpUrl url, String name) {
List<Cookie> cookies = loadForRequest(url); List<Cookie> cookies = loadForRequest(url);
for (Cookie cookie : cookies) { for (Cookie cookie : cookies) {
if(Objects.equals(cookie.name(), name)) { if (Objects.equals(cookie.name(), name)) {
return cookie; return cookie;
} }
} }
@ -78,7 +107,7 @@ public class CookieJarImpl implements CookieJar {
Cookie cookie = iterator.next(); Cookie cookie = iterator.next();
if(Objects.equals(cookie.name(), name)) { if(Objects.equals(cookie.name(), name)) {
iterator.remove(); iterator.remove();
LOG.debug("Removed cookie \"{}\" for {}", name, url.toString()); LOG.debug("Removed cookie \"{}\" for {}", name, url);
return; return;
} }
} }
@ -86,11 +115,6 @@ public class CookieJarImpl implements CookieJar {
} }
private String getDomain(HttpUrl url) { private String getDomain(HttpUrl url) {
// String host = url.host();
// if (host.startsWith("www.")) {
// host = host.substring(4);
// }
// return host;
return url.topPrivateDomain(); return url.topPrivateDomain();
} }