Index: java/org/apache/commons/httpclient/cookie/CookieSpecBase.java =================================================================== RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/cookie/CookieSpecBase.java,v retrieving revision 1.13 diff -u -r1.13 CookieSpecBase.java --- java/org/apache/commons/httpclient/cookie/CookieSpecBase.java 7 Mar 2003 18:23:45 -0000 1.13 +++ java/org/apache/commons/httpclient/cookie/CookieSpecBase.java 15 Apr 2003 23:22:35 -0000 @@ -63,18 +63,17 @@ package org.apache.commons.httpclient.cookie; -import java.util.List; -import java.util.LinkedList; import java.util.Date; -import java.util.Locale; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import org.apache.commons.httpclient.NameValuePair; -import org.apache.commons.httpclient.HttpException; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HeaderElement; -import org.apache.commons.httpclient.Cookie; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.util.DateParseException; +import org.apache.commons.httpclient.util.DateParser; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -95,26 +94,11 @@ * * @since 2.0 */ - public class CookieSpecBase implements CookieSpec { + /** Log object */ protected static final Log LOG = LogFactory.getLog(CookieSpec.class); - /** List of valid date formats for the "expires" cookie attribute. */ - private static final DateFormat[] EXPIRY_FORMATS = { - // RFC 1123, 822, Date and time specification is English. - new SimpleDateFormat("EEE, dd-MMM-yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE dd-MMM-yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE dd-MMM-yyyy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE dd MMM yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE dd MMM yyyy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE, dd MMM yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE, dd-MMM-yyyy HH-mm-ss z", Locale.US), - new SimpleDateFormat("EEE dd-MMM-yyyy HH-mm-ss z", Locale.US) - }; - /** Default constructor */ public CookieSpecBase() { super(); @@ -348,7 +332,6 @@ throw new MalformedCookieException( "Missing value for expires attribute"); } - boolean set = false; // trim single quotes around expiry if present // see http://nagoya.apache.org/bugzilla/show_bug.cgi?id=5279 if (paramValue.length() > 1 @@ -358,18 +341,10 @@ = paramValue.substring (1, paramValue.length() - 1); } - for (int k = 0; k < EXPIRY_FORMATS.length; k++) { - - try { - Date date = EXPIRY_FORMATS[k].parse(paramValue); - cookie.setExpiryDate(date); - set = true; - break; - } catch (ParseException e) { - //Ignore and move on - } - } - if (!set) { + try { + cookie.setExpiryDate(DateParser.parseDate(paramValue)); + } catch (DateParseException dpe) { + LOG.debug("Error parsing cookie date", dpe); throw new MalformedCookieException( "Unable to parse expiration date parameter: " + paramValue); Index: java/org/apache/commons/httpclient/cookie/NetscapeDraftSpec.java =================================================================== RCS file: /home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/cookie/NetscapeDraftSpec.java,v retrieving revision 1.7 diff -u -r1.7 NetscapeDraftSpec.java --- java/org/apache/commons/httpclient/cookie/NetscapeDraftSpec.java 28 Jan 2003 04:40:23 -0000 1.7 +++ java/org/apache/commons/httpclient/cookie/NetscapeDraftSpec.java 15 Apr 2003 23:22:35 -0000 @@ -63,14 +63,13 @@ package org.apache.commons.httpclient.cookie; -import java.util.StringTokenizer; import java.util.Date; -import java.util.Locale; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.text.ParseException; -import org.apache.commons.httpclient.NameValuePair; +import java.util.StringTokenizer; + import org.apache.commons.httpclient.Cookie; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.util.DateParseException; +import org.apache.commons.httpclient.util.DateParser; /** *
Netscape cookie draft specific cookie management functions
@@ -126,11 +125,9 @@
"Missing value for expires attribute");
}
try {
- DateFormat expiryFormat = new SimpleDateFormat(
- "EEE, dd-MMM-yyyy HH:mm:ss z", Locale.US);
- Date date = expiryFormat.parse(paramValue);
+ Date date = DateParser.parseDate(paramValue);
cookie.setExpiryDate(date);
- } catch (ParseException e) {
+ } catch (DateParseException e) {
throw new MalformedCookieException("Invalid expires "
+ "attribute: " + e.getMessage());
}
Index: java/org/apache/commons/httpclient/util/DateParseException.java
===================================================================
RCS file: java/org/apache/commons/httpclient/util/DateParseException.java
diff -N java/org/apache/commons/httpclient/util/DateParseException.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ java/org/apache/commons/httpclient/util/DateParseException.java 15 Apr 2003 23:22:35 -0000
@@ -0,0 +1,27 @@
+package org.apache.commons.httpclient.util;
+
+
+/**
+ * An exception to indicate an error parsing a date string.
+ *
+ * @see DateParser
+ *
+ * @author Michael Becke
+ */
+public class DateParseException extends Exception {
+
+ /**
+ *
+ */
+ public DateParseException() {
+ super();
+ }
+
+ /**
+ * @param message the exception message
+ */
+ public DateParseException(String message) {
+ super(message);
+ }
+
+}
Index: java/org/apache/commons/httpclient/util/DateParser.java
===================================================================
RCS file: java/org/apache/commons/httpclient/util/DateParser.java
diff -N java/org/apache/commons/httpclient/util/DateParser.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ java/org/apache/commons/httpclient/util/DateParser.java 15 Apr 2003 23:22:36 -0000
@@ -0,0 +1,106 @@
+package org.apache.commons.httpclient.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/**
+ * A utility class for parsing HTTP dates as used in cookies and other headers.
+ * This class handles dates as defined by RFC 2616 section 3.3.1 as well as
+ * some other common non-standard formats.
+ *
+ * @author Christopher Brown
+ * @author Michael Becke
+ */
+public class DateParser {
+
+ /**
+ * Date format pattern used to parse HTTP date headers in RFC 1123 format.
+ */
+ public static final String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";
+
+ /**
+ * Date format pattern used to parse HTTP date headers in RFC 1036 format.
+ */
+ public static final String PATTERN_RFC1036 = "EEEE, dd-MMM-yy HH:mm:ss zzz";
+
+ /**
+ * Date format pattern used to parse HTTP date headers in ANSI C
+ * asctime() format.
+ */
+ public static final String PATTERN_ASCTIME = "EEE MMM d HH:mm:ss yyyy";
+
+ /** The patterns used for parsing dates */
+ private static final String[] DATE_PATTERNS = {
+ PATTERN_RFC1123,
+ PATTERN_RFC1036,
+ PATTERN_ASCTIME,
+ "EEE, dd-MMM-yyyy HH:mm:ss z",
+ "EEE, dd-MMM-yyyy HH-mm-ss z",
+ "EEE, dd MMM yy HH:mm:ss z",
+ "EEE dd-MMM-yyyy HH:mm:ss z",
+ "EEE dd MMM yyyy HH:mm:ss z",
+ "EEE dd-MMM-yyyy HH-mm-ss z",
+ "EEE dd-MMM-yy HH:mm:ss z",
+ "EEE dd MMM yy HH:mm:ss z",
+ };
+
+ /**
+ * Parses a date value.
+ *
+ * @param dateValue the date value to parse
+ *
+ * @return the parsed date
+ *
+ * @throws DateParseException if the value could not be parsed using any of the
+ * supported date formats
+ */
+ public static Date parseDate(String dateValue) throws DateParseException {
+ return parseDate(dateValue, DATE_PATTERNS);
+ }
+
+ /**
+ * Parses the date value using the array of date formats.
+ *
+ * @param dateValue the date value to parse
+ * @param dateFormats the date formats to use
+ *
+ * @return the parsed date
+ *
+ * @throws DateParseException if none of the dataFormats could parse the dateValue
+ */
+ private static Date parseDate(
+ String dateValue,
+ String[] dateFormats
+ ) throws DateParseException {
+
+ if (dateValue == null) {
+ throw new IllegalArgumentException("dateValue is null");
+ }
+
+ SimpleDateFormat dateParser = null;
+
+ for (int i = 0; i < dateFormats.length; i++) {
+ if (dateParser == null) {
+ dateParser = new SimpleDateFormat(dateFormats[i], Locale.US);
+ dateParser.setTimeZone(TimeZone.getTimeZone("GMT"));
+ } else {
+ dateParser.applyPattern(dateFormats[i]);
+ }
+ try {
+ return dateParser.parse(dateValue);
+ } catch (ParseException pe) {
+ // ignore this exception, we will try the next format
+ }
+ }
+
+ // we were unable to parse the date
+ throw new DateParseException("Unable to parse the date " + dateValue);
+ }
+
+ /** This class should not be instantiated. */
+ private DateParser() { }
+
+}