diff --git a/common/src/main/java/ctbrec/io/CookieJarImpl.java b/common/src/main/java/ctbrec/io/CookieJarImpl.java index add7b643..59ec056a 100644 --- a/common/src/main/java/ctbrec/io/CookieJarImpl.java +++ b/common/src/main/java/ctbrec/io/CookieJarImpl.java @@ -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> cookieStore = new HashMap<>(); @@ -28,7 +29,7 @@ public class CookieJarImpl implements CookieJar { String host = getDomain(url); List cookiesForUrl = cookieStore.get(host); if (cookiesForUrl != null) { - cookiesForUrl = new ArrayList(cookiesForUrl); //unmodifiable + cookiesForUrl = new ArrayList<>(cookiesForUrl); for (Iterator 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 loadForRequest(HttpUrl url) { + LOG.debug("Loading cookies for {}", url); String host = getDomain(url); List cookies = cookieStore.get(host); + List 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(); + Optional.ofNullable(result).ifPresent(cookiez -> cookiez.forEach(c -> LOG.trace("Cookies for {}: {}", url, c))); + return result; + } + + private void addCookieToResult(HttpUrl url, List result, Cookie cookie) { + Optional 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 getCookieFromCollection(Collection 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 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(); }