You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by jo...@gmail.com on 2009/10/10 06:36:59 UTC

Support fallback URL in proxy (#2)

Reviewers: shindig.remailer_gmail.com,

Description:
Support a fallback_url parameter in the content proxy. This URL is
fetched when the original target URL returns an error (HTTP >= 400).

This is of particular value with the image proxy: fallback_url can be
set to a valid known image to avoid broken images showing up.

Includes tweaks and a fix verified in integration test.

Please review this at http://codereview.appspot.com/130055

Affected files:
    
java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
    
java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java


Index:  
java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
===================================================================
---  
java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java	 
(revision 820902)
+++  
java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java	 
(working copy)
@@ -20,6 +20,7 @@

  import static org.easymock.EasyMock.capture;
  import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;

  import com.google.common.collect.Maps;

@@ -145,7 +146,30 @@
      assertEquals(magicGarbage, recorder.getHeader("X-Magic-Garbage"));
      assertTrue(rewriter.responseWasRewritten());
    }
+
+  public void testGetFallback() throws Exception {
+    String url = "http://example.org/file.evil";
+    String domain = "example.org";
+    String fallback_url = "http://fallback.com/fallback.png";

+     
expect(lockedDomainService.isSafeForOpenProxy(domain)).andReturn(true).atLeastOnce();
+    setupProxyRequestMock(domain, url);
+     
expect(request.getParameter(ProxyBase.IGNORE_CACHE_PARAM)).andReturn("1").atLeastOnce();
+     
expect(request.getParameter(ProxyHandler.FALLBACK_URL_PARAM)).andReturn(fallback_url).atLeastOnce();
+
+    HttpRequest req = new HttpRequest(Uri.parse(url)).setIgnoreCache(true);
+    HttpResponse resp = HttpResponse.error();
+    HttpResponse fallback_resp = new HttpResponse("Fallback");
+    expect(pipeline.execute(req)).andReturn(resp);
+     
expect(pipeline.execute(isA(HttpRequest.class))).andReturn(fallback_resp);
+
+    replay();
+
+    proxyHandler.fetch(request, recorder);
+
+    verify();
+  }
+
    public void testNoCache() throws Exception {
      String url = "http://example.org/file.evil";
      String domain = "example.org";
Index:  
java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
===================================================================
---  
java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java	 
(revision 822533)
+++  
java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java	 
(working copy)
@@ -55,6 +55,8 @@
    private static final String[] INTEGER_RESIZE_PARAMS = new String[] {
      PARAM_RESIZE_HEIGHT, PARAM_RESIZE_WIDTH, PARAM_RESIZE_QUALITY,  
PARAM_NO_EXPAND
    };
+
+  static final String FALLBACK_URL_PARAM = "fallback_url";

    private final RequestPipeline requestPipeline;
    private final LockedDomainService lockedDomainService;
@@ -72,8 +74,13 @@
    /**
     * Generate a remote content request based on the parameters sent from  
the client.
     */
-  private HttpRequest buildHttpRequest(HttpServletRequest request) throws  
GadgetException {
-    Uri url = validateUrl(request.getParameter(URL_PARAM));
+  private HttpRequest buildHttpRequest(HttpServletRequest request, String  
urlParam)
+      throws GadgetException {
+    String theUrl = request.getParameter(urlParam);
+    if (theUrl == null) {
+      return null;
+    }
+    Uri url = validateUrl(theUrl);

      HttpRequest req = new HttpRequest(url)
          .setContainer(getContainer(request));
@@ -135,8 +142,17 @@
        throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,  
msg);
      }

-    HttpRequest rcr = buildHttpRequest(request);
+    HttpRequest rcr = buildHttpRequest(request, URL_PARAM);
      HttpResponse results = requestPipeline.execute(rcr);
+
+    if (results.isError()) {
+      // Error: try the fallback. Particularly useful for proxied images.
+      HttpRequest fallbackRcr = buildHttpRequest(request,  
FALLBACK_URL_PARAM);
+      if (fallbackRcr != null) {
+        results = requestPipeline.execute(fallbackRcr);
+      }
+    }
+
      if (contentRewriterRegistry != null) {
        try {
          results = contentRewriterRegistry.rewriteHttpResponse(rcr,  
results);