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_EXTENDED_DATE_PATTERNS_1;
18  import static org.htmlunit.BrowserVersionFeatures.HTTP_COOKIE_EXTENDED_DATE_PATTERNS_2;
19  
20  import java.util.Date;
21  
22  import org.apache.http.client.utils.DateUtils;
23  import org.apache.http.cookie.MalformedCookieException;
24  import org.apache.http.cookie.SetCookie;
25  import org.apache.http.impl.cookie.BasicExpiresHandler;
26  import org.htmlunit.BrowserVersion;
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  final class HtmlUnitExpiresHandler extends BasicExpiresHandler {
42  
43      
44      private static final String[] DEFAULT_DATE_PATTERNS = {
45          "EEE MMM dd yyyy HH mm ss 'GMT'Z",
46          "EEE dd MMM yy HH mm ss zzz",
47          "EEE dd MMM yyyy HH mm ss zzz",
48          "EEE MMM d HH mm ss yyyy",
49          "EEE dd MMM yy HH mm ss z ",
50          "EEE dd MMM yyyy HH mm ss z ",
51          "EEE dd MM yy HH mm ss z ",
52          "EEE dd MM yyyy HH mm ss z ",
53      };
54  
55      private static final String[] EXTENDED_DATE_PATTERNS_1 = {
56          "EEE MMM dd yyyy HH mm ss 'GMT'Z",
57          "EEE dd MMM yy HH mm ss zzz",
58          "EEE dd MMM yyyy HH mm ss zzz",
59          "EEE MMM d HH mm ss yyyy",
60          "EEE dd MMM yy HH mm ss z ",
61          "EEE dd MMM yyyy HH mm ss z ",
62          "EEE dd MM yy HH mm ss z ",
63          "EEE dd MM yyyy HH mm ss z ",
64          "d/M/yyyy"
65      };
66  
67      private static final String[] EXTENDED_DATE_PATTERNS_2 = {
68          "EEE MMM dd yyyy HH mm ss 'GMT'Z",
69          "EEE dd MMM yy HH mm ss zzz",
70          "EEE dd MMM yyyy HH mm ss zzz",
71          "EEE MMM d HH mm ss yyyy",
72          "EEE dd MMM yy HH mm ss z ",
73          "EEE dd MMM yyyy HH mm ss z ",
74          "EEE dd MM yy HH mm ss z ",
75          "EEE dd MM yyyy HH mm ss z ",
76          "EEE dd MMM yy HH MM ss z",
77          "MMM dd yy HH mm ss"
78      };
79  
80      private final BrowserVersion browserVersion_;
81  
82      HtmlUnitExpiresHandler(final BrowserVersion browserVersion) {
83          super(DEFAULT_DATE_PATTERNS);
84          browserVersion_ = browserVersion;
85      }
86  
87      @Override
88      public void parse(final SetCookie cookie, String value) throws MalformedCookieException {
89          if (value.startsWith("\"") && value.endsWith("\"")) {
90              value = value.substring(1, value.length() - 1);
91          }
92          value = value.replaceAll("[ ,:-]+", " ");
93  
94          Date startDate = null;
95          String[] datePatterns = DEFAULT_DATE_PATTERNS;
96  
97          if (null != browserVersion_) {
98              startDate = HtmlUnitBrowserCompatCookieSpec.DATE_1_1_1970;
99  
100             if (browserVersion_.hasFeature(HTTP_COOKIE_EXTENDED_DATE_PATTERNS_1)) {
101                 datePatterns = EXTENDED_DATE_PATTERNS_1;
102             }
103 
104             if (browserVersion_.hasFeature(HTTP_COOKIE_EXTENDED_DATE_PATTERNS_2)) {
105                 datePatterns = EXTENDED_DATE_PATTERNS_2;
106             }
107         }
108 
109         final Date expiry = DateUtils.parseDate(value, datePatterns, startDate);
110         cookie.setExpiryDate(expiry);
111     }
112 }