Author: lindner
Date: Sat Apr  5 13:46:51 2008
New Revision: 645176

URL: http://svn.apache.org/viewvc?rev=645176&view=rev
Log:
SHINDIG-162 changes to support in-browser and CDN caching
- Non signed/authenticated/postdata requests are sent with GET method
  - supplied refresh_interval determines length of cache
  - new REFRESH_INTERVAL opt for makeRequest
- _IG_Fetch* routines pass along refreshInterval
- Proxy sets cache headers properly depending on refresh param

Modified:
    incubator/shindig/trunk/features/core.io/io.js
    incubator/shindig/trunk/features/core/legacy.js
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java

Modified: incubator/shindig/trunk/features/core.io/io.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core.io/io.js?rev=645176&r1=645175&r2=645176&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core.io/io.js (original)
+++ incubator/shindig/trunk/features/core.io/io.js Sat Apr  5 13:46:51 2008
@@ -171,7 +171,7 @@
   }
 
   /**
-   * Sends an XHR post request
+   * Sends an XHR post or get request
    *
    * @param realUrl The url to fetch data from that was requested by the gadget
    * @param proxyUrl The url to proxy through
@@ -181,18 +181,26 @@
    * @param processResponseFunction The function that should process the
    *     response from the sever before calling the callback
    */
-  function makePostRequest(realUrl, proxyUrl, callback, postData, params,
+  function makeXhrRequest(realUrl, proxyUrl, callback, paramData, params,
       processResponseFunction) {
     var xhr = makeXhr();
-    xhr.open("POST", proxyUrl, true);
+    var method = (paramData != null) ? "POST" : "GET";
+
+    xhr.open(method, proxyUrl, true);
     if (callback) {
       xhr.onreadystatechange = gadgets.util.makeClosure(
           null, processResponseFunction, realUrl, callback, params, xhr);
     }
-    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-    xhr.send(postData);
+    if (paramData != null) {
+        xhr.setRequestHeader('Content-Type', 
'application/x-www-form-urlencoded');
+        xhr.send(paramData);
+    } else {
+        xhr.send(null);
+    }
   }
 
+
+
   /**
    * Satisfy a request with data that is prefetched as per the gadget Preload
    * directive. The preloader will only satisfy a request for a specific piece
@@ -272,6 +280,11 @@
           oauthService = params.OAUTH_SERVICE;
           oauthToken = params.OAUTH_TOKEN;
         }
+      } else {
+        // Non auth'd & non post'd requests are cachable
+        if (!params.REFRESH_INTERVAL && !params.POST_DATA) {
+          params.REFRESH_INTERVAL = 3600;
+         }
       }
 
       var headers = params.HEADERS || {};
@@ -279,7 +292,7 @@
         headers["Content-Type"] = "application/x-www-form-urlencoded";
       }
 
-      var postData = {
+      var paramData = {
         url: url,
         httpMethod : params.METHOD || "GET",
         headers: gadgets.io.encodeValues(headers, false),
@@ -291,9 +304,21 @@
         oauthToken : oauthToken || ""
       };
 
-      if (!respondWithPreload(postData, params, callback, processResponse)) {
-        makePostRequest(url, config.jsonProxyUrl, callback,
-            gadgets.io.encodeValues(postData), params, processResponse);
+      if (!respondWithPreload(paramData, params, callback, processResponse)) {
+
+        var refreshInterval = params.REFRESH_INTERVAL || 0;
+  
+        if (refreshInterval > 0) {
+          // this content should be cached
+          // Add paramData to the URL
+          var extraparams = "&refresh=" + refreshInterval + '&' + 
gadgets.io.encodeValues(paramData);
+
+          makeXhrRequest(url, config.jsonProxyUrl + extraparams, callback, 
null, params, processResponse);
+
+        } else {
+          makeXhrRequest(url, config.jsonProxyUrl, callback,
+              gadgets.io.encodeValues(paramData), params, processResponse);
+        }
       }
     },
 
@@ -302,7 +327,7 @@
      */
     makeNonProxiedRequest : function (relativeUrl, callback, opt_params) {
       var params = opt_params || {};
-      makePostRequest(relativeUrl, relativeUrl, callback, params.POST_DATA,
+      makeXhrRequest(relativeUrl, relativeUrl, callback, params.POST_DATA,
           params, processNonProxiedResponse);
     },
 
@@ -357,6 +382,7 @@
   "AUTHORIZATION",
   "NUM_ENTRIES",
   "GET_SUMMARIES",
+  "REFRESH_INTERVAL",
   "OAUTH_SERVICE",
   "OAUTH_TOKEN"
 ]);

Modified: incubator/shindig/trunk/features/core/legacy.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core/legacy.js?rev=645176&r1=645175&r2=645176&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core/legacy.js (original)
+++ incubator/shindig/trunk/features/core/legacy.js Sat Apr  5 13:46:51 2008
@@ -34,12 +34,24 @@
 
 function _IG_FetchContent(url, callback, opt_params) {
   var params = opt_params || {};
+  // this is really the only legacy parameter documented
+  // at http://code.google.com/apis/gadgets/docs/remote-content.html#Params
+  if (params.refreshInterval) {
+    params['REFRESH_INTERVAL'] = params.refreshInterval;
+  } else {
+    params['REFRESH_INTERVAL'] = 3600;
+  }
   var cb = gadgets.util.makeClosure(null, _IG_Fetch_wrapper, callback);
   gadgets.io.makeRequest(url, cb, params);
 }
 
 function _IG_FetchXmlContent(url, callback, opt_params) {
   var params = opt_params || {};
+  if (params.refreshInterval) {
+    params['REFRESH_INTERVAL'] = params.refreshInterval;
+  } else {
+    params['REFRESH_INTERVAL'] = 3600;
+  }
   params.CONTENT_TYPE = "DOM";
   var cb = gadgets.util.makeClosure(null, _IG_Fetch_wrapper, callback);
   gadgets.io.makeRequest(url, cb, params);

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java?rev=645176&r1=645175&r2=645176&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java
 Sat Apr  5 13:46:51 2008
@@ -65,6 +65,8 @@
   public static final String AUTHZ_SIGNED = "signed";
   // Spec really should say 'OAUTH' rather than 'AUTHENTICATED'
   public static final String AUTHZ_OAUTH = "authenticated";
+  private static final String REFRESH_PARAM = "refresh";
+
 
   private final GadgetTokenDecoder gadgetTokenDecoder;
   private final SigningFetcherFactory signingFetcherFactory;
@@ -127,9 +129,17 @@
     // Serialize the response
     String output = serializeJsonResponse(request, fetcher, results);
 
+
+    // Find and set the refresh interval
+    int refreshInterval = 0;
+
+    if (request.getParameter(REFRESH_PARAM) != null) {
+      refreshInterval =  Integer.valueOf(request.getParameter(REFRESH_PARAM));
+    }
+    HttpUtil.setCachingHeaders(response, refreshInterval);
+
     response.setStatus(HttpServletResponse.SC_OK);
     response.setContentType("application/json; charset=utf-8");
-    response.setHeader("Pragma", "no-cache");
     response.setHeader("Content-Disposition", "attachment;filename=p.txt");
     response.getWriter().write(output);
   }


Reply via email to