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:
parent
5293affe4d
commit
4c1b311559
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue