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