1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.httpclient;
16
17 import static org.htmlunit.BrowserVersionFeatures.HTTP_COOKIE_REMOVE_DOT_FROM_ROOT_DOMAINS;
18
19 import java.net.InetAddress;
20 import java.net.UnknownHostException;
21 import java.util.Locale;
22
23 import org.apache.http.cookie.Cookie;
24 import org.apache.http.cookie.CookieOrigin;
25 import org.apache.http.cookie.MalformedCookieException;
26 import org.apache.http.cookie.SetCookie;
27 import org.apache.http.impl.cookie.BasicDomainHandler;
28 import org.apache.http.util.Args;
29 import org.apache.http.util.TextUtils;
30 import org.htmlunit.BrowserVersion;
31 import org.htmlunit.HttpHeader;
32
33
34
35
36
37
38
39 final class HtmlUnitDomainHandler extends BasicDomainHandler {
40 private final BrowserVersion browserVersion_;
41
42 HtmlUnitDomainHandler(final BrowserVersion browserVersion) {
43 super();
44 browserVersion_ = browserVersion;
45 }
46
47 @Override
48 public void parse(final SetCookie cookie, final String value)
49 throws MalformedCookieException {
50 Args.notNull(cookie, HttpHeader.COOKIE);
51 if (TextUtils.isBlank(value)) {
52 throw new MalformedCookieException("Blank or null value for domain attribute");
53 }
54
55 if (value.endsWith(".")) {
56 return;
57 }
58 String domain = value.toLowerCase(Locale.ROOT);
59
60 final int dotIndex = domain.indexOf('.');
61 if (browserVersion_.hasFeature(HTTP_COOKIE_REMOVE_DOT_FROM_ROOT_DOMAINS)
62 && dotIndex == 0 && domain.length() > 1 && domain.indexOf('.', 1) == -1) {
63 domain = domain.substring(1);
64 }
65 if (dotIndex > 0) {
66 domain = '.' + domain;
67 }
68
69 cookie.setDomain(domain);
70 }
71
72
73
74
75 @Override
76 public boolean match(final Cookie cookie, final CookieOrigin origin) {
77 String domain = cookie.getDomain();
78 if (domain == null) {
79 return false;
80 }
81
82 final int dotIndex = domain.indexOf('.');
83 if (dotIndex == 0 && domain.length() > 1 && domain.indexOf('.', 1) == -1) {
84 final String host = origin.getHost();
85 if (browserVersion_.hasFeature(HTTP_COOKIE_REMOVE_DOT_FROM_ROOT_DOMAINS)) {
86 domain = domain.substring(1);
87 }
88 return host.equalsIgnoreCase(domain);
89 }
90
91 if (dotIndex == -1
92 && !HtmlUnitBrowserCompatCookieSpec.LOCAL_FILESYSTEM_DOMAIN.equalsIgnoreCase(domain)) {
93 try {
94 InetAddress.getByName(domain);
95 }
96 catch (final UnknownHostException e) {
97 return false;
98 }
99 }
100
101 return super.match(cookie, origin);
102 }
103 }