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