You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2008/05/10 02:28:55 UTC
svn commit: r654993 - in
/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets:
AbstractContentCache.java http/HttpUtil.java
Author: etnu
Date: Fri May 9 17:28:55 2008
New Revision: 654993
URL: http://svn.apache.org/viewvc?rev=654993&view=rev
Log:
Applying SHINDIG-257, contributed by Brian Eaton.
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractContentCache.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractContentCache.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractContentCache.java?rev=654993&r1=654992&r2=654993&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractContentCache.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractContentCache.java Fri May 9 17:28:55 2008
@@ -17,10 +17,9 @@
*/
package org.apache.shindig.gadgets;
+import org.apache.shindig.gadgets.http.HttpUtil;
+
import java.net.URI;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -33,12 +32,6 @@
*/
public abstract class AbstractContentCache implements ContentCache {
- /**
- * Used to parse Expires: header.
- */
- private final static DateFormat dateFormat
- = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
-
public final RemoteContent getContent(RemoteContentRequest request) {
if (canCacheRequest(request)) {
return getContent(request.getUri());
@@ -109,15 +102,15 @@
String expires = content.getHeader("Expires");
if (expires != null) {
- try {
- Date expiresDate = dateFormat.parse(expires);
- long expiresMs = expiresDate.getTime();
- if (expiresMs > now) {
- return content;
- } else {
- return null;
- }
- } catch (ParseException e) {
+ Date expiresDate = HttpUtil.parseDate(expires);
+ if (expiresDate == null) {
+ // parse problem
+ return null;
+ }
+ long expiresMs = expiresDate.getTime();
+ if (expiresMs > now) {
+ return content;
+ } else {
return null;
}
}
@@ -142,7 +135,7 @@
long maxAgeMs = Long.parseLong(parts[1]) * 1000;
Date newExpiry = new Date(now + maxAgeMs);
content.getAllHeaders()
- .put("Expires", Arrays.asList(dateFormat.format(newExpiry)));
+ .put("Expires", Arrays.asList(HttpUtil.formatDate(newExpiry)));
return content;
} catch (NumberFormatException e) {
return null;
@@ -166,7 +159,7 @@
// if no other directives exist
Date newExpiry = new Date(now + getDefaultTTL());
content.getAllHeaders()
- .put("Expires", Arrays.asList(dateFormat.format(newExpiry)));
+ .put("Expires", Arrays.asList(HttpUtil.formatDate(newExpiry)));
return content;
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java?rev=654993&r1=654992&r2=654993&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java Fri May 9 17:28:55 2008
@@ -28,7 +28,6 @@
import org.json.JSONException;
import org.json.JSONObject;
-import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
@@ -48,8 +47,23 @@
// 1 year.
private static final int DEFAULT_TTL = 60 * 60 * 24 * 365;
- public static final DateFormat DATE_HEADER_FORMAT = new SimpleDateFormat(
- "EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+ /**
+ * Format to use for date headers (see section 3.3.1 of RFC 2616).
+ *
+ * Note that the SimpleDateFormat parsing rules are generous and can read
+ * all three of the formats specified by RFC 2616.
+ */
+ public static final String HTTP_DATE_HEADER_FORMAT =
+ "EEE, dd MMM yyyy HH:mm:ss zzz";
+
+ // SimpleDateFormat: slow to init, but not thread-safe.
+ private static ThreadLocal<SimpleDateFormat> httpDateFormatter =
+ new ThreadLocal<SimpleDateFormat>() {
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat(HTTP_DATE_HEADER_FORMAT, Locale.US);
+ }
+ };
/**
* Sets default caching Headers (Expires, Cache-Control, Last-Modified)
@@ -84,6 +98,33 @@
// Firefox requires this for certain cases.
response.setDateHeader("Last-Modified", START_TIME);
}
+
+ /**
+ * Parses an HTTP date. Returns null if the date fails to parse for any
+ * reason.
+ *
+ * @param dateStr
+ * @return the date
+ */
+ public static Date parseDate(String dateStr) {
+ try {
+ return httpDateFormatter.get().parse(dateStr);
+ } catch (Exception e) {
+ // Don't care.
+ return null;
+ }
+ }
+
+ /**
+ * Formats a date for use in HTTP headers.
+ *
+ * @param date
+ * @return HTTP date string.
+ */
+ public static String formatDate(Date date) {
+ return httpDateFormatter.get().format(date);
+ }
+
/**
* Takes a set of recevied HTTP headers and adjusts them to enforce
@@ -99,12 +140,9 @@
long originalAge = 0L;
if (newHeaders.containsKey("Expires")) {
- try {
- Date date = DATE_HEADER_FORMAT
- .parse(originalHeaders.get("Expires").get(0));
+ Date date = parseDate(originalHeaders.get("Expires").get(0));
+ if (date != null) {
originalAge = date.getTime() - System.currentTimeMillis();
- } catch (Exception e) {
- // Dont care
}
}
@@ -145,7 +183,7 @@
// Replace with new consistent headers
newHeaders.put("Expires", Arrays.asList(
- DATE_HEADER_FORMAT.format(new Date(age + System.currentTimeMillis()))));
+ formatDate(new Date(age + System.currentTimeMillis()))));
newHeaders.put("Cache-Control",
Arrays.asList("public, max-age=" + (age / 1000L)));