You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by ga...@apache.org on 2011/03/18 16:03:29 UTC

svn commit: r1082941 - in /shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/servlet/AccelHandler.java test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java

Author: gagan
Date: Fri Mar 18 15:03:29 2011
New Revision: 1082941

URL: http://svn.apache.org/viewvc?rev=1082941&view=rev
Log:
Patch by atulvasu | Issue 4240102: Serving the original response incase of RewriterException for Accel | http://codereview.appspot.com/4240102/

Modified:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/AccelHandler.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/AccelHandler.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/AccelHandler.java?rev=1082941&r1=1082940&r2=1082941&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/AccelHandler.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/AccelHandler.java Fri Mar 18 15:03:29 2011
@@ -42,6 +42,8 @@ import org.apache.shindig.gadgets.uri.Ur
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * Handles requests for accel servlet.
@@ -51,6 +53,8 @@ import java.io.IOException;
  */
 @Singleton
 public class AccelHandler {
+  private static final Logger logger = Logger.getLogger(
+      AccelHandler.class.getName());
   static final String ERROR_FETCHING_DATA = "Error fetching data";
   protected final RequestPipeline requestPipeline;
   protected final ResponseRewriterRegistry contentRewriterRegistry;
@@ -86,10 +90,8 @@ public class AccelHandler {
       try {
         results = contentRewriterRegistry.rewriteHttpResponse(req, results);
       } catch (RewritingException e) {
-        if (!isRecoverable(req, results, e)) {
-          throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, e,
-                                    e.getHttpStatusCode());
-        }
+        logger.log(Level.WARNING, "Rewriting failed, serving original results", e);
+        // In case of exception continue using original results.
       }
     } else {
       results = errorResponse;
@@ -143,28 +145,6 @@ public class AccelHandler {
   }
 
   /**
-   * Returns true in case the error encountered while rewriting the content
-   * is recoverable. The rationale behind it is that errors should be thrown
-   * only in case of serious grave errors (defined to be un recoverable).
-   * It should always be preferred to handle errors and return the original
-   * content at least.
-   *
-   * TODO: Think through all cases which are recoverable to enforce minimal
-   * possible set of constraints.
-   * TODO: Log the exception and context around it.
-   *
-   * @param req The http request for fetching the resource.
-   * @param results The result of rewriting.
-   * @param exception Exception caught.
-   * @return True if the error is recoverable, false otherwise.
-   */
-  protected boolean isRecoverable(HttpRequest req, HttpResponse results,
-                                  RewritingException exception) {
-    return !(Strings.isNullOrEmpty(results.getResponseAsString()) &&
-             results.getHeaders() == null);
-  }
-
-  /**
    * Build an HttpRequest object encapsulating the request details as requested
    * by the user.
    * @param httpRequest The http request.
@@ -188,7 +168,7 @@ public class AccelHandler {
 
     // Set and copy headers.
     ServletUtil.setXForwardedForHeader(httpRequest, req);
-    
+
     UriUtils.copyRequestHeaders(
         httpRequest, req,
         UriUtils.DisallowedHeaders.POST_INCOMPATIBLE_DIRECTIVES,

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=1082941&r1=1082940&r2=1082941&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 Mar 18 15:03:29 2011
@@ -31,6 +31,7 @@ import org.apache.shindig.gadgets.http.H
 import org.apache.shindig.gadgets.rewrite.CaptureRewriter;
 import org.apache.shindig.gadgets.rewrite.DefaultResponseRewriterRegistry;
 import org.apache.shindig.gadgets.rewrite.ResponseRewriter;
+import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.gadgets.uri.AccelUriManager;
 import org.apache.shindig.gadgets.uri.DefaultAccelUriManager;
 import org.apache.shindig.gadgets.uri.DefaultProxyUriManager;
@@ -51,6 +52,11 @@ import static org.easymock.EasyMock.expe
 
 public class HtmlAccelServletTest extends ServletTestFixture {
 
+  private final ContainerConfig config = new FakeContainerConfig();
+
+  private final AccelUriManager accelUriManager = new DefaultAccelUriManager(
+      config, new DefaultProxyUriManager(config, null));
+
   private static class FakeContainerConfig extends BasicContainerConfig {
     protected final Map<String, Object> data = ImmutableMap.<String, Object>builder()
         .put(AccelUriManager.PROXY_HOST_PARAM, "apache.org")
@@ -84,9 +90,6 @@ public class HtmlAccelServletTest extend
 
   @Before
   public void setUp() throws Exception {
-    ContainerConfig config = new FakeContainerConfig();
-    AccelUriManager accelUriManager = new DefaultAccelUriManager(
-        config, new DefaultProxyUriManager(config, null));
 
     rewriter = new FakeCaptureRewriter();
     rewriterRegistry = new DefaultResponseRewriterRegistry(
@@ -398,4 +401,39 @@ public class HtmlAccelServletTest extend
     assertEquals(200, recorder.getHttpStatusCode());
     assertTrue(rewriter.responseWasRewritten());
   }
+
+  @Test
+  public void testReturnOriginalResponseIfRewritingFails() throws Exception {
+    ResponseRewriter throwingRewriter = new ResponseRewriter() {
+      public void rewrite(HttpRequest request, HttpResponseBuilder response)
+          throws RewritingException {
+        response.setContent(REWRITE_CONTENT);
+        throw new RewritingException("", 404);
+      }
+    };
+    rewriterRegistry = new DefaultResponseRewriterRegistry(
+        Arrays.<ResponseRewriter>asList(throwingRewriter), null);
+    servlet = new HtmlAccelServlet();
+    servlet.setHandler(new AccelHandler(pipeline, rewriterRegistry,
+                                        accelUriManager, true));
+    String url = "http://example.org/data.html";
+    String data = "<html><body>Hello World</body></html>";
+
+    HttpRequest req = new HttpRequest(Uri.parse(url));
+    req.addHeader("Host", Uri.parse(url).getAuthority());
+    HttpResponse resp = new HttpResponseBuilder()
+        .setResponse(data.getBytes())
+        .setHeader("Content-Type", "text/html")
+        .setHttpStatusCode(200)
+        .create();
+    expect(pipeline.execute(req)).andReturn(resp).once();
+    expectRequest("", url);
+    replay();
+
+    servlet.doGet(request, recorder);
+
+    verify();
+    assertEquals(data, recorder.getResponseAsString());
+    assertEquals(200, recorder.getHttpStatusCode());
+  }
 }