28 import java.util.List; |
28 import java.util.List; |
29 import java.util.StringTokenizer; |
29 import java.util.StringTokenizer; |
30 import java.util.NoSuchElementException; |
30 import java.util.NoSuchElementException; |
31 import java.text.SimpleDateFormat; |
31 import java.text.SimpleDateFormat; |
32 import java.util.TimeZone; |
32 import java.util.TimeZone; |
|
33 import java.util.Calendar; |
|
34 import java.util.GregorianCalendar; |
33 import java.util.Date; |
35 import java.util.Date; |
34 import java.util.Locale; |
36 import java.util.Locale; |
35 import java.util.Objects; |
37 import java.util.Objects; |
36 |
38 |
37 /** |
39 /** |
87 // date formats used by Netscape's cookie draft |
89 // date formats used by Netscape's cookie draft |
88 // as well as formats seen on various sites |
90 // as well as formats seen on various sites |
89 private final static String[] COOKIE_DATE_FORMATS = { |
91 private final static String[] COOKIE_DATE_FORMATS = { |
90 "EEE',' dd-MMM-yyyy HH:mm:ss 'GMT'", |
92 "EEE',' dd-MMM-yyyy HH:mm:ss 'GMT'", |
91 "EEE',' dd MMM yyyy HH:mm:ss 'GMT'", |
93 "EEE',' dd MMM yyyy HH:mm:ss 'GMT'", |
92 "EEE MMM dd yyyy HH:mm:ss 'GMT'Z" |
94 "EEE MMM dd yyyy HH:mm:ss 'GMT'Z", |
|
95 "EEE',' dd-MMM-yy HH:mm:ss 'GMT'", |
|
96 "EEE',' dd MMM yy HH:mm:ss 'GMT'", |
|
97 "EEE MMM dd yy HH:mm:ss 'GMT'Z" |
93 }; |
98 }; |
94 |
99 |
95 // constant strings represent set-cookie header token |
100 // constant strings represent set-cookie header token |
96 private final static String SET_COOKIE = "set-cookie:"; |
101 private final static String SET_COOKIE = "set-cookie:"; |
97 private final static String SET_COOKIE2 = "set-cookie2:"; |
102 private final static String SET_COOKIE2 = "set-cookie2:"; |
1023 * |
1028 * |
1024 * @return delta seconds between this cookie's creation time and the time |
1029 * @return delta seconds between this cookie's creation time and the time |
1025 * specified by dateString |
1030 * specified by dateString |
1026 */ |
1031 */ |
1027 private long expiryDate2DeltaSeconds(String dateString) { |
1032 private long expiryDate2DeltaSeconds(String dateString) { |
|
1033 Calendar cal = new GregorianCalendar(GMT); |
1028 for (int i = 0; i < COOKIE_DATE_FORMATS.length; i++) { |
1034 for (int i = 0; i < COOKIE_DATE_FORMATS.length; i++) { |
1029 SimpleDateFormat df = new SimpleDateFormat(COOKIE_DATE_FORMATS[i], |
1035 SimpleDateFormat df = new SimpleDateFormat(COOKIE_DATE_FORMATS[i], |
1030 Locale.US); |
1036 Locale.US); |
|
1037 cal.set(1970, 0, 1, 0, 0, 0); |
1031 df.setTimeZone(GMT); |
1038 df.setTimeZone(GMT); |
|
1039 df.setLenient(false); |
|
1040 df.set2DigitYearStart(cal.getTime()); |
1032 try { |
1041 try { |
1033 Date date = df.parse(dateString); |
1042 cal.setTime(df.parse(dateString)); |
1034 return (date.getTime() - whenCreated) / 1000; |
1043 if (!COOKIE_DATE_FORMATS[i].contains("yyyy")) { |
|
1044 // 2-digit years following the standard set |
|
1045 // out it rfc 6265 |
|
1046 int year = cal.get(Calendar.YEAR); |
|
1047 year %= 100; |
|
1048 if (year < 70) { |
|
1049 year += 2000; |
|
1050 } else { |
|
1051 year += 1900; |
|
1052 } |
|
1053 cal.set(Calendar.YEAR, year); |
|
1054 } |
|
1055 return (cal.getTimeInMillis() - whenCreated) / 1000; |
1035 } catch (Exception e) { |
1056 } catch (Exception e) { |
1036 // Ignore, try the next date format |
1057 // Ignore, try the next date format |
1037 } |
1058 } |
1038 } |
1059 } |
1039 return 0; |
1060 return 0; |