package org.lobobrowser.request; import java.net.URI; import java.util.Date; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; import org.lobobrowser.util.Strings; final class CookieDetails { private static final Logger logger = Logger.getLogger(CookieDetails.class.getName()); public CookieDetails(final URI requestURL, final String name, final String value, final String domain, final String path, final Optional<Date> expires, final Long maxAge, final boolean secure, final boolean httpOnly) { this.requestURL = requestURL; this.name = name; this.value = value; this.domain = domain; this.path = path; this.expires = expires; this.maxAge = maxAge; this.secure = secure; this.httpOnly = httpOnly; this.requestHostName = requestURL.getHost(); } final URI requestURL; final String requestHostName; final String name; final String value; final String domain; private final String path; final Optional<Date> expires; final Long maxAge; final boolean secure, httpOnly; final String getEffectivePath() { if ((path == null) || (path.length() == 0) || (path.charAt(0) != '/')) { return getDefaultPath(); } else { return path; } } /* As per section 5.1.4 of RFC 6265 */ private String getDefaultPath() { final String urlPath = requestURL.getPath(); if ((urlPath == null) || (urlPath.length() == 0) || (urlPath.charAt(0) != '/')) { return "/"; } else if (Strings.countChars(urlPath, '/') == 1) { return "/"; } else { return urlPath.substring(0, urlPath.lastIndexOf('/')); } } final String getEffectiveDomain() { if (domain == null) { return requestHostName; } else if (domain.startsWith(".")) { return domain.substring(1); } else { return domain; } } final Optional<java.util.Date> getExpiresDate() { Optional<java.util.Date> expiresDate = Optional.empty(); if (maxAge != null) { if (maxAge <= 0) { logger.log(Level.WARNING, "getExpiresDate(): Max-age is negative or zero: " + maxAge + "."); expiresDate = Optional.of(new java.util.Date(0)); } else { expiresDate = Optional.of(new java.util.Date(System.currentTimeMillis() + (maxAge * 1000))); } } else if (expires.isPresent()) { return expires; } return expiresDate; } boolean isValidDomain() { if (domain != null) { if ((expires == null) && (maxAge == null) && logger.isLoggable(Level.INFO)) { // TODO: Check if this is true: // One of the RFCs says transient cookies should not have // a domain specified, but websites apparently rely on that, // specifically Paypal. logger.log(Level.INFO, "Not rejecting transient cookie that specifies domain '" + domain + "'."); } // if (!Domains.isValidCookieDomain(domain, urlHostName)) { if (!DomainValidation.isValidCookieDomain(domain, requestHostName)) { logger.log(Level.WARNING, "saveCookie(): Rejecting cookie with invalid domain '" + domain + "' for host '" + requestHostName + "'."); return false; } } return true; } @Override public String toString() { return "CookieDetails [name=" + name + ", value=" + value + ", domain=" + domain + ", path=" + path + ", expires=" + expires + ", maxAge=" + maxAge + ", effectivePath=" + getEffectivePath() + ", expiresDate=" + getExpiresDate() + "]"; } }