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 }