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)));