package ctbrec.io; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import okhttp3.Cookie; import okhttp3.CookieJar; import okhttp3.HttpUrl; public class CookieJarImpl implements CookieJar { private static final transient Logger LOG = LoggerFactory.getLogger(CookieJarImpl.class); private final HashMap> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List cookies) { String host = getDomain(url); List cookiesForUrl = cookieStore.get(host); if (cookiesForUrl != null) { cookiesForUrl = new ArrayList(cookiesForUrl); //unmodifiable for (Iterator iterator = cookiesForUrl.iterator(); iterator.hasNext();) { Cookie oldCookie = iterator.next(); String name = oldCookie.name(); for (Cookie newCookie : cookies) { if(newCookie.name().equalsIgnoreCase(name)) { LOG.trace("Replacing cookie {} {} -> {} [{}]", oldCookie.name(), oldCookie.value(), newCookie.value(), oldCookie.domain()); iterator.remove(); break; } } } cookiesForUrl.addAll(cookies); cookieStore.put(host, cookiesForUrl); LOG.trace("Adding cookie: {} for {}", cookiesForUrl, host); } else { cookieStore.put(host, cookies); LOG.trace("Storing cookie: {} for {}", cookies, host); } } @Override public List loadForRequest(HttpUrl url) { String host = getDomain(url); List cookies = cookieStore.get(host); 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(); } public Cookie getCookie(HttpUrl url, String name) { List cookies = loadForRequest(url); for (Cookie cookie : cookies) { if(Objects.equals(cookie.name(), name)) { return cookie; } } throw new NoSuchElementException("No cookie named " + name + " for " + url.host() + " available"); } public void deleteCookie(HttpUrl url, String name) { List cookies = loadForRequest(url); for (Iterator iterator = cookies.iterator(); iterator.hasNext();) { Cookie cookie = iterator.next(); if(Objects.equals(cookie.name(), name)) { iterator.remove(); LOG.debug("Removed cookie \"{}\" for {}", name, url.toString()); return; } } throw new NoSuchElementException("No cookie named " + name + " for " + url.host() + " available"); } private String getDomain(HttpUrl url) { // String host = url.host(); // if (host.startsWith("www.")) { // host = host.substring(4); // } // return host; return url.topPrivateDomain(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (Entry> entry : cookieStore.entrySet()) { sb.append(entry.getKey()).append(": ").append(entry.getValue()).append('\n'); } return sb.toString(); } public Map> getCookies() { return cookieStore; } public void clear() { cookieStore.clear(); } }