You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by lr...@apache.org on 2008/07/18 02:21:01 UTC

svn commit: r677786 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/http/ main/java/org/apache/shindig/gadgets/servlet/ test/java/org/apache/shindig/gadgets/http/

Author: lryan
Date: Thu Jul 17 17:21:00 2008
New Revision: 677786

URL: http://svn.apache.org/viewvc?rev=677786&view=rev
Log:
Add support for open-proxy requests to force a minimum TTL for the fetched content to live in the HTTP cache.

Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/BasicHttpCacheTest.java

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java?rev=677786&r1=677785&r2=677786&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java Thu Jul 17 17:21:00 2008
@@ -43,6 +43,13 @@
 
   public HttpResponse addResponse(HttpRequest request, HttpResponse response) {
     if (canCacheRequest(request)) {
+
+      // If the request forces a minimum TTL for the cached content then have
+      // the response honor it
+      if (response != null) {
+        response.setForcedCacheTTL(request.getOptions().minCacheTtl);
+      }
+
       // !!! Note that we only rewrite cacheable content. Move this call above the if
       // to rewrite all content that passes through the cache regardless of cacheability
       rewrite(request, response);

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java?rev=677786&r1=677785&r2=677786&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java Thu Jul 17 17:21:00 2008
@@ -19,8 +19,8 @@
 
 package org.apache.shindig.gadgets.http;
 
-import org.apache.shindig.gadgets.rewrite.ContentRewriter;
 import org.apache.commons.lang.ArrayUtils;
+import org.apache.shindig.gadgets.rewrite.ContentRewriter;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -29,9 +29,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.TreeMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 
 /**
  * Holds request data for passing to a RemoteContentFetcher.
@@ -358,6 +358,7 @@
     public boolean ignoreCache = false;
     public boolean ownerSigned = true;
     public boolean viewerSigned = true;
+    public int minCacheTtl = -1;
     public ContentRewriter rewriter = null;
     public String rewriteMimeType = null;
     public URI gadgetUri;
@@ -372,6 +373,7 @@
       this.ownerSigned = copyFrom.ownerSigned;
       this.viewerSigned = copyFrom.viewerSigned;
       this.rewriter = copyFrom.rewriter;
+      this.minCacheTtl = copyFrom.minCacheTtl;
       if (copyFrom.gadgetUri != null) {
         this.gadgetUri = URI.create(copyFrom.gadgetUri.toString());
       }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java?rev=677786&r1=677785&r2=677786&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java Thu Jul 17 17:21:00 2008
@@ -17,14 +17,16 @@
  */
 package org.apache.shindig.gadgets.http;
 
-import org.apache.shindig.common.util.DateUtil;
-import org.apache.commons.lang.ArrayUtils;
-
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
+
 import com.ibm.icu.text.CharsetDetector;
 import com.ibm.icu.text.CharsetMatch;
 
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.shindig.common.util.DateUtil;
+
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
@@ -318,6 +320,19 @@
   }
 
   /**
+   * Set the externally forced minimum cache min-TTL
+   * This is derived from the "refresh" param on OpenProxy request
+   * Value is in seconds
+   */
+  public void setForcedCacheTTL(int forcedCacheTtl) {
+    if (forcedCacheTtl > 0) {
+      this.headers.remove("Expires");
+      this.headers.remove("Pragma");
+      this.headers.put("Cache-Control", Lists.newArrayList("public,max-age=" + forcedCacheTtl));
+    }
+  }
+
+  /**
    * @return consolidated cache expiration time or -1
    */
   public long getCacheExpiration() {

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=677786&r1=677785&r2=677786&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java Thu Jul 17 17:21:00 2008
@@ -18,6 +18,9 @@
  */
 package org.apache.shindig.gadgets.servlet;
 
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.LockedDomainService;
 import org.apache.shindig.gadgets.http.HttpFetcher;
@@ -25,9 +28,6 @@
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.rewrite.ContentRewriter;
 
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
 import java.io.IOException;
 import java.net.URI;
 import java.util.HashSet;
@@ -94,6 +94,17 @@
     // a content type like text/html which unfortunately happens all too often
     options.rewriteMimeType = request.getParameter(REWRITE_MIME_TYPE_PARAM);
 
+    // If the proxy request specifies a refresh param then we want to force the min TTL for
+    // the retrieved entry in the cache regardless of the headers on the content when it
+    // is fetched from the original source.
+    if (request.getParameter(REFRESH_PARAM) != null) {
+      try {
+        options.minCacheTtl = Integer.parseInt(request.getParameter(REFRESH_PARAM));
+      } catch (NumberFormatException nfe) {
+        // Ignore
+      }
+    }
+
     return new HttpRequest(url, options);
   }
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/BasicHttpCacheTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/BasicHttpCacheTest.java?rev=677786&r1=677785&r2=677786&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/BasicHttpCacheTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/BasicHttpCacheTest.java Thu Jul 17 17:21:00 2008
@@ -17,11 +17,11 @@
  */
 package org.apache.shindig.gadgets.http;
 
-import org.apache.shindig.common.util.DateUtil;
-import org.apache.commons.lang.ArrayUtils;
-
 import junit.framework.TestCase;
 
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.shindig.common.util.DateUtil;
+
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Date;
@@ -161,4 +161,20 @@
     assertNull(cache.getResponse(req));
   }
 
+  public void testCacheableWithForcedMinTTL() {
+    HttpRequest req = createRequest("GET");
+    // in seconds
+    req.getOptions().minCacheTtl = 5;
+    HttpResponse resp = createExpiresResponse(200, System.currentTimeMillis());
+    cache.addResponse(req, resp);
+    try {
+      synchronized (cache) {
+        cache.wait(2000L);
+      }
+    } catch (InterruptedException ie) {
+      fail("Failed to wait for cache");
+    }
+    assertNotNull(cache.getResponse(req));
+  }
+
 }