You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by zh...@apache.org on 2010/04/30 18:30:34 UTC
svn commit: r939732 - in /shindig/trunk/java/gadgets/src:
main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
Author: zhoresh
Date: Fri Apr 30 16:30:34 2010
New Revision: 939732
URL: http://svn.apache.org/viewvc?rev=939732&view=rev
Log:
Add support for chain style params to accel servlet
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java?rev=939732&r1=939731&r2=939732&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java Fri Apr 30 16:30:34 2010
@@ -17,10 +17,12 @@
*/
package org.apache.shindig.gadgets.servlet;
+import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import org.apache.commons.io.IOUtils;
+import org.apache.shindig.common.uri.UriBuilder;
import org.apache.shindig.gadgets.DefaultGadgetSpecFactory;
import org.apache.shindig.gadgets.GadgetContext;
import org.apache.shindig.gadgets.GadgetException;
@@ -28,8 +30,10 @@ import org.apache.shindig.gadgets.Gadget
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.http.RequestPipeline;
+import org.apache.shindig.gadgets.uri.UriCommon;
import java.io.IOException;
+import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -59,6 +63,7 @@ public class HtmlAccelServlet extends Ga
public static final String HTML_CONTENT = "text/html";
public static final String CONTENT_ENCODING = "Content-Encoding";
public static final String CONTENT_LENGTH = "Content-Length";
+ public static final String DEFAULT_CONTAINER ="accel";
/** Fake spec to wrap the html data */
private static final String FAKE_SPEC_TPL =
@@ -90,7 +95,7 @@ public class HtmlAccelServlet extends Ga
@Named("shindig.accelerate.added-params") Map<String, String> params) {
this.addedServletParams = params;
}
-
+
public static boolean isAccel(GadgetContext context) {
return context.getParameter(HtmlAccelServlet.ACCEL_GADGET_PARAM_NAME) ==
HtmlAccelServlet.ACCEL_GADGET_PARAM_VALUE;
@@ -102,7 +107,20 @@ public class HtmlAccelServlet extends Ga
// Get data to accelerate:
HttpResponse data;
- HttpGadgetContext context = new HttpGadgetContext(req);
+ final Map<String, List<String>> requestParams = getAccelParams(req);
+
+ // Create request to handle parsed params
+ final HttpServletRequestWrapper dataWrapper = new HttpServletRequestWrapper(req) {
+ @Override
+ public String getParameter(String name) {
+ if (requestParams.containsKey(name)) {
+ List<String> values = requestParams.get(name);
+ if (values != null && values.size() > 0) return values.get(0);
+ }
+ return null;
+ }
+ };
+ HttpGadgetContext context = new HttpGadgetContext(dataWrapper);
try {
data = fetch(context);
} catch (GadgetException e) {
@@ -125,6 +143,12 @@ public class HtmlAccelServlet extends Ga
// For html, use the gadgetServlet for rewrite
String content = data.getResponseAsString();
+ // Use response TTL, by using the refresh param:
+ if (!requestParams.containsKey(UriCommon.Param.REFRESH.getKey()) && data.getCacheTtl() > 0) {
+ requestParams.put(UriCommon.Param.REFRESH.getKey(),
+ ImmutableList.of(Long.toString(data.getCacheTtl() / 1000)));
+ }
+
// Create fake spec wrapper for the html:
// (Note that the content can be big so don't use the limited String.Format)
final String spec = createFakeSpec(content);
@@ -143,7 +167,11 @@ public class HtmlAccelServlet extends Ga
if (name == DefaultGadgetSpecFactory.RAW_GADGETSPEC_XML_PARAM_NAME) {
return spec;
}
- // Allow overriding extra params (i.e. container)
+ String value = dataWrapper.getParameter(name);
+ if (value != null) {
+ return value;
+ }
+ // Allow overriding extra params
if (addedServletParams != null && addedServletParams.containsKey(name)) {
return addedServletParams.get(name);
}
@@ -174,7 +202,6 @@ public class HtmlAccelServlet extends Ga
}
private HttpResponse fetch(HttpGadgetContext context) throws GadgetException {
-
if (context.getUrl() == null) {
throw new GadgetException(Code.INVALID_PARAMETER, "Missing url paramater",
HttpResponse.SC_BAD_REQUEST);
@@ -213,4 +240,45 @@ public class HtmlAccelServlet extends Ga
.replace("<![CDATA[", "]]><![CDATA[");
return String.format(FAKE_SPEC_TPL, data);
}
+
+ /**
+ * Parse request to get accelerated parameters
+ * Support parameterize using the url query param,
+ * Or chained using the url pattern: <prefix>/<params>/<url>
+ * For example:
+ * http://shindig.com/gadgets/accel/refresh=300/http://example.com/accelerate.html?id=X
+ */
+ protected Map<String, List<String>> getAccelParams(HttpServletRequest req) {
+ String path = new UriBuilder(req).getPath();
+ String accelServletPrefix = req.getServletPath();
+
+ String paramsStr = null;
+ String accelUrl = null;
+ // Check for chain param style request:
+ if (path.startsWith(accelServletPrefix + "/")) {
+ int startQuery = accelServletPrefix.length() + 1;
+ int endQuery = path.indexOf("/", startQuery);
+ if (endQuery >= startQuery) {
+ paramsStr = path.substring(startQuery, endQuery);
+ accelUrl = path.substring(endQuery + 1); // + "?" + req.getQueryString();
+ }
+ }
+ // Otherwise Get original request params:
+ if (paramsStr == null) {
+ paramsStr = req.getQueryString();
+ }
+
+ // Convert to parameter maps:
+ UriBuilder uriBuilder = new UriBuilder().setQuery(paramsStr);
+ Map<String, List<String>> params = uriBuilder.getQueryParameters();
+ if (accelUrl != null) {
+ params.put(UriCommon.Param.URL.getKey(), ImmutableList.of(accelUrl));
+ }
+
+ // Add defaults:
+ if (!params.containsKey(UriCommon.Param.CONTAINER.getKey())) {
+ params.put(UriCommon.Param.CONTAINER.getKey(), ImmutableList.of(DEFAULT_CONTAINER));
+ }
+ return params;
+ }
}
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java?rev=939732&r1=939731&r2=939732&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java Fri Apr 30 16:30:34 2010
@@ -18,10 +18,11 @@
*/
package org.apache.shindig.gadgets.servlet;
+import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
-import com.google.caja.util.Maps;
+import com.google.common.collect.Maps;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.Gadget;
@@ -33,6 +34,7 @@ import org.apache.shindig.gadgets.http.H
import org.apache.shindig.gadgets.http.HttpResponseBuilder;
import org.apache.shindig.gadgets.render.Renderer;
import org.apache.shindig.gadgets.render.RenderingResults;
+import org.easymock.Capture;
import org.junit.Before;
import org.junit.Test;
@@ -42,7 +44,7 @@ import java.util.Map;
public class HtmlAccelServletTest extends ServletTestFixture {
private static final String REWRITE_CONTENT = "working rewrite";
-
+ private static final String SERVLET = "/gadgets/accel";
private HtmlAccelServlet servlet;
private Renderer renderer;
@@ -61,7 +63,7 @@ public class HtmlAccelServletTest extend
HttpRequest req = new HttpRequest(Uri.parse(url));
expect(pipeline.execute(req)).andReturn(null).once();
- expect(request.getParameter("url")).andReturn(url).once();
+ expectRequest("", url);
replay();
servlet.doGet(request, recorder);
@@ -82,7 +84,7 @@ public class HtmlAccelServletTest extend
.setHttpStatusCode(200)
.create();
expect(pipeline.execute(req)).andReturn(resp).once();
- expect(request.getParameter("url")).andReturn(url).once();
+ expectRequest("", url);
replay();
servlet.doGet(request, recorder);
@@ -102,10 +104,7 @@ public class HtmlAccelServletTest extend
.setHttpStatusCode(200)
.create();
expect(pipeline.execute(req)).andReturn(resp).once();
- expect(request.getParameter("url")).andReturn(url).once();
- expect(request.getRequestURL()).andReturn(new StringBuffer("apache.org/gadgets/accel"))
- .once();
- expect(request.getQueryString()).andReturn("url=" + url).once();
+ expectRequest("", url);
expect(renderer.render(isA(GadgetContext.class)))
.andReturn(RenderingResults.ok(REWRITE_CONTENT));
replay();
@@ -117,6 +116,62 @@ public class HtmlAccelServletTest extend
}
@Test
+ public void testHtmlAccelRewriteChain() throws Exception {
+ String url = "http://example.org/data.html?id=1";
+ String data = "<html><body>Hello World</body></html>";
+
+ Capture<HttpRequest> reqCapture = new Capture<HttpRequest>();
+ HttpResponse resp = new HttpResponseBuilder()
+ .setResponse(data.getBytes())
+ .setHeader("Content-Type", "text/html")
+ .setCacheTtl(567)
+ .setHttpStatusCode(200)
+ .create();
+ expect(pipeline.execute(capture(reqCapture))).andReturn(resp).once();
+ expectRequest("//" + url, null);
+ expect(renderer.render(isA(GadgetContext.class)))
+ .andReturn(RenderingResults.ok(REWRITE_CONTENT));
+ replay();
+
+ servlet.doGet(request, recorder);
+ verify();
+ HttpRequest req = reqCapture.getValue();
+ assertEquals(url, req.getUri().toString());
+ assertEquals("accel", req.getContainer());
+ assertEquals(REWRITE_CONTENT, recorder.getResponseAsString());
+ assertEquals(200, recorder.getHttpStatusCode());
+ assertEquals("private,max-age=566", recorder.getHeader("Cache-Control"));
+ // Note: due to rounding (MS to S conversion), ttl is down by 1
+ }
+
+ @Test
+ public void testHtmlAccelRewriteChainParams() throws Exception {
+ String url = "http://example.org/data.html?id=1";
+ String data = "<html><body>Hello World</body></html>";
+
+ HttpResponse resp = new HttpResponseBuilder()
+ .setResponse(data.getBytes())
+ .setHeader("Content-Type", "text/html")
+ .setHttpStatusCode(200)
+ .create();
+ Capture<HttpRequest> reqCapture = new Capture<HttpRequest>();
+ expect(pipeline.execute(capture(reqCapture))).andReturn(resp).once();
+ expectRequest("/container=open&refresh=3600/" + url, null);
+ expect(renderer.render(isA(GadgetContext.class)))
+ .andReturn(RenderingResults.ok(REWRITE_CONTENT));
+ replay();
+
+ servlet.doGet(request, recorder);
+ verify();
+ HttpRequest req = reqCapture.getValue();
+ assertEquals(url, req.getUri().toString());
+ assertEquals("open", req.getContainer());
+ assertEquals(REWRITE_CONTENT, recorder.getResponseAsString());
+ assertEquals(200, recorder.getHttpStatusCode());
+ assertEquals("private,max-age=3600", recorder.getHeader("Cache-Control"));
+ }
+
+ @Test
public void testHtmlAccelRewriteErrorCode() throws Exception {
String url = "http://example.org/data.html";
String data = "<html><body>This is error page</body></html>";
@@ -128,10 +183,7 @@ public class HtmlAccelServletTest extend
.setHttpStatusCode(404)
.create();
expect(pipeline.execute(req)).andReturn(resp).once();
- expect(request.getParameter("url")).andReturn(url).once();
- expect(request.getRequestURL()).andReturn(new StringBuffer("apache.org/gadgets/accel"))
- .once();
- expect(request.getQueryString()).andReturn("url=" + url).once();
+ expectRequest("", url);
expect(renderer.render(isA(GadgetContext.class)))
.andReturn(RenderingResults.ok(REWRITE_CONTENT));
replay();
@@ -154,10 +206,7 @@ public class HtmlAccelServletTest extend
.setHttpStatusCode(500)
.create();
expect(pipeline.execute(req)).andReturn(resp).once();
- expect(request.getParameter("url")).andReturn(url).once();
- expect(request.getRequestURL()).andReturn(new StringBuffer("apache.org/gadgets/accel"))
- .once();
- expect(request.getQueryString()).andReturn("url=" + url).once();
+ expectRequest("", url);
expect(renderer.render(isA(GadgetContext.class)))
.andReturn(RenderingResults.ok(REWRITE_CONTENT));
replay();
@@ -192,16 +241,26 @@ public class HtmlAccelServletTest extend
.setHttpStatusCode(200)
.create();
expect(pipeline.execute(req)).andReturn(resp).once();
- expect(request.getParameter("url")).andReturn(url).once();
- expect(request.getRequestURL()).andReturn(new StringBuffer("apache.org/gadgets/accel"))
- .once();
- expect(request.getQueryString()).andReturn("url=" + url).once();
+ expectRequest("", url);
replay();
servlet.doGet(request, recorder);
verify();
}
-
+
+ private void expectRequest(String extraPath, String url) {
+ expect(request.getServletPath()).andReturn(SERVLET).anyTimes();
+ expect(request.getScheme()).andReturn("http").once();
+ expect(request.getServerName()).andReturn("apache.org").once();
+ expect(request.getServerPort()).andReturn(-1).once();
+ expect(request.getRequestURI()).andReturn(SERVLET + extraPath).anyTimes();
+ expect(request.getRequestURL())
+ .andReturn(new StringBuffer("apache.org" + SERVLET + extraPath))
+ .anyTimes();
+ String queryParams = (url == null ? "" : "url=" + url);
+ expect(request.getQueryString()).andReturn(queryParams).anyTimes();
+ }
+
private static class FakeUrlGenerator implements UrlGenerator {
public UrlValidationStatus validateJsUrl(String url) {