Author: awiner
Date: Wed Jun 10 20:37:37 2009
New Revision: 783494

URL: http://svn.apache.org/viewvc?rev=783494&view=rev
Log:
Unify proxy handling of errors, and some small improvements:
- Make servlets truly trivial by moving exception handling into ProxyBase
- Report GadgetExceptions for internal server errors as 500s, and log as 
warnings
- Catch illegal exceptions for incorrect "refresh" params on proxy requests and 
treat as 400s

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestServlet.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyServlet.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyBaseTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
 Wed Jun 10 20:37:37 2009
@@ -79,7 +79,7 @@
         response.getOutputStream().println("/* ---- Start " + url + " ---- 
*/");
 
         ResponseWrapper wrapper = new ResponseWrapper(response);
-        proxyHandler.fetch(new RequestWrapper(request, url), wrapper);
+        proxyHandler.doFetch(new RequestWrapper(request, url), wrapper);
 
         if (wrapper.getStatus() != HttpServletResponse.SC_OK) {
           response.getOutputStream().println(

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 Wed Jun 10 20:37:37 2009
@@ -77,7 +77,7 @@
    * Executes a request, returning the response as JSON to be handled by 
makeRequest.
    */
   @Override
-  public void fetch(HttpServletRequest request, HttpServletResponse response)
+  protected void doFetch(HttpServletRequest request, HttpServletResponse 
response)
       throws GadgetException, IOException {
     HttpRequest rcr = buildHttpRequest(request);
 

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestServlet.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestServlet.java
 Wed Jun 10 20:37:37 2009
@@ -19,17 +19,14 @@
 package org.apache.shindig.gadgets.servlet;
 
 import org.apache.shindig.common.servlet.InjectedServlet;
-import org.apache.shindig.gadgets.GadgetException;
-
-import com.google.inject.Inject;
 
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.google.inject.Inject;
+
 /**
  * Handles calls to gadgets.io.makeRequest.
  *
@@ -39,8 +36,6 @@
  * makeRequest and open proxy calls.
  */
 public class MakeRequestServlet extends InjectedServlet {
-  private final static Logger LOG = 
Logger.getLogger(MakeRequestServlet.class.getName());
-
   private MakeRequestHandler makeRequestHandler;
 
   @Inject
@@ -51,12 +46,7 @@
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse 
response)
       throws IOException {
-    try {
-      makeRequestHandler.fetch(request, response);
-    } catch (GadgetException e) {
-      // TODO: Move this logic into ProxyHandler / MakeRequestHandler.
-      outputError(e, response);
-    }
+    makeRequestHandler.fetch(request, response);
   }
 
   @Override
@@ -64,15 +54,4 @@
       throws IOException {
     doGet(request, response);
   }
-
-  /**
-   * Outputs an error message for the request if it fails.
-   *
-   * TODO: Eliminate this.
-   */
-  private static void outputError(GadgetException e, HttpServletResponse resp)
-      throws IOException {
-    LOG.log(Level.INFO, "makeRequest failed", e);
-    resp.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
-  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java
 Wed Jun 10 20:37:37 2009
@@ -30,6 +30,8 @@
 
 import java.io.IOException;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -55,6 +57,8 @@
       "vary", "expires", "date", "pragma", "cache-control", 
"transfer-encoding", "www-authenticate"
   );
 
+  private static final Logger logger = 
Logger.getLogger(ProxyBase.class.getName());
+  
   /**
    * Validates the given url.
    *
@@ -112,12 +116,17 @@
    */
   @SuppressWarnings("boxing")
   protected void setResponseHeaders(HttpServletRequest request,
-      HttpServletResponse response, HttpResponse results) {
+      HttpServletResponse response, HttpResponse results) throws 
GadgetException {
     int refreshInterval = 0;
     if (results.isStrictNoCache()) {
       refreshInterval = 0;
-    } else  if (request.getParameter(REFRESH_PARAM) != null) {
-      refreshInterval =  Integer.valueOf(request.getParameter(REFRESH_PARAM));
+    } else if (request.getParameter(REFRESH_PARAM) != null) {
+      try {
+        refreshInterval =  
Integer.valueOf(request.getParameter(REFRESH_PARAM));
+      } catch (NumberFormatException nfe) {
+        throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
+            "refresh parameter is not a number");
+      }
     } else {
       refreshInterval = Math.max(60 * 60, (int)(results.getCacheTtl() / 
1000L));
     }
@@ -133,7 +142,39 @@
   /**
    * Processes the given request.
    */
-  abstract public void fetch(HttpServletRequest request, HttpServletResponse 
response)
+  public final void fetch(HttpServletRequest request, HttpServletResponse 
response)
+      throws IOException {
+    try {
+      doFetch(request, response);
+    } catch (GadgetException e) {
+      outputError(response, e);
+    }
+  }
+
+  /**
+   * Outputs an error message for the request if it fails.
+   */
+  protected void outputError(HttpServletResponse resp, GadgetException e)
+      throws IOException {
+    
+    int responseCode;
+    Level level = Level.FINE;
+    
+    switch (e.getCode()) {
+      case INTERNAL_SERVER_ERROR:
+        responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+        level = Level.WARNING;
+        break;
+      default:
+        responseCode = HttpServletResponse.SC_BAD_REQUEST;
+        break;
+    }
+    
+    logger.log(level, "Request failed", e);
+    resp.sendError(responseCode, e.getMessage());
+  }
+
+  abstract protected void doFetch(HttpServletRequest request, 
HttpServletResponse response)
       throws GadgetException, IOException;
 
   protected boolean getIgnoreCache(HttpServletRequest request) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 Wed Jun 10 20:37:37 2009
@@ -117,7 +117,7 @@
   }
 
   @Override
-  public void fetch(HttpServletRequest request, HttpServletResponse response)
+  protected void doFetch(HttpServletRequest request, HttpServletResponse 
response)
       throws IOException, GadgetException {
     if (request.getHeader("If-Modified-Since") != null) {
       response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyServlet.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyServlet.java
 Wed Jun 10 20:37:37 2009
@@ -19,24 +19,19 @@
 package org.apache.shindig.gadgets.servlet;
 
 import org.apache.shindig.common.servlet.InjectedServlet;
-import org.apache.shindig.gadgets.GadgetException;
-
-import com.google.inject.Inject;
 
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.google.inject.Inject;
+
 /**
  * Handles open proxy requests (used in rewriting and for URLs returned by
  * gadgets.io.getProxyUrl).
  */
 public class ProxyServlet extends InjectedServlet {
-  private final static Logger LOG = 
Logger.getLogger(ProxyServlet.class.getName());
-
   private ProxyHandler proxyHandler;
 
   @Inject
@@ -47,21 +42,6 @@
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse 
response)
       throws IOException {
-    try {
-      proxyHandler.fetch(new ProxyServletRequest(request), response);
-    } catch (GadgetException e) {
-      outputError(e, response);
-    }
-  }
-
-  /**
-   * Outputs an error message for the request if it fails and if FINE logging 
level.
-   */
-  private static void outputError(GadgetException e, HttpServletResponse resp)
-      throws IOException {
-    if (LOG.isLoggable(Level.FINE)) {
-      LOG.log(Level.FINE, "Make Request failed", e);
-    }
-    resp.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
+    proxyHandler.fetch(new ProxyServletRequest(request), response);
   }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 Wed Jun 10 20:37:37 2009
@@ -391,7 +391,7 @@
     replay();
 
     try {
-      handler.fetch(request, recorder);
+      handler.doFetch(request, recorder);
       fail("Should have thrown");
     } catch (GadgetException e) {
       // good.

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyBaseTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyBaseTest.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyBaseTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyBaseTest.java
 Wed Jun 10 20:37:37 2009
@@ -43,7 +43,7 @@
 
   private final ProxyBase proxy = new ProxyBase() {
     @Override
-    public void fetch(HttpServletRequest request, HttpServletResponse 
response) {
+    protected void doFetch(HttpServletRequest request, HttpServletResponse 
response) {
       // Nothing.
     }
   };
@@ -137,7 +137,7 @@
   }
   }
 
-  public void testSetResponseHeaders() {
+  public void testSetResponseHeaders() throws Exception {
     HttpResponse results = new HttpResponseBuilder().create();
     replay();
 
@@ -149,7 +149,7 @@
     assertEquals("attachment;filename=p.txt", 
recorder.getHeader("Content-Disposition"));
   }
 
-  public void testSetResponseHeadersForFlash() {
+  public void testSetResponseHeadersForFlash() throws Exception {
     HttpResponse results = new HttpResponseBuilder()
         .setHeader("Content-Type", "application/x-shockwave-flash")
         .create();
@@ -165,7 +165,7 @@
         recorder.getHeader("Content-Disposition"));
   }
 
-  public void testSetResponseHeadersNoCache() {
+  public void testSetResponseHeadersNoCache() throws Exception {
     Map<String, List<String>> headers = 
Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
     headers.put("Pragma", Arrays.asList("no-cache"));
     HttpResponse results = new HttpResponseBuilder()
@@ -182,7 +182,7 @@
     assertEquals("attachment;filename=p.txt", 
recorder.getHeader("Content-Disposition"));
   }
 
-  public void testSetResponseHeadersForceParam() {
+  public void testSetResponseHeadersForceParam() throws Exception {
     HttpResponse results = new HttpResponseBuilder().create();
     
expect(request.getParameter(ProxyBase.REFRESH_PARAM)).andReturn("30").anyTimes();
     replay();
@@ -193,6 +193,19 @@
     assertEquals("attachment;filename=p.txt", 
recorder.getHeader("Content-Disposition"));
   }
 
+  public void testSetResponseHeadersForceParamInvalid() throws Exception {
+    HttpResponse results = new HttpResponseBuilder().create();
+    
expect(request.getParameter(ProxyBase.REFRESH_PARAM)).andReturn("foo").anyTimes();
+    replay();
+
+    try {
+      proxy.setResponseHeaders(request, recorder, results);
+    } catch (GadgetException e) {
+      assertEquals(GadgetException.Code.INVALID_PARAMETER, e.getCode());
+    }
+  }
+
+
   public void testGetParameter() {
     expect(request.getParameter("foo")).andReturn("bar");
     replay();

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java?rev=783494&r1=783493&r2=783494&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 Wed Jun 10 20:37:37 2009
@@ -116,7 +116,7 @@
     
expect(lockedDomainService.isSafeForOpenProxy("www.example.com")).andReturn(false);
     replay();
     try {
-      proxyHandler.fetch(request, response);
+      proxyHandler.doFetch(request, response);
       fail("Should have thrown");
     } catch (GadgetException e) {
       // good


Reply via email to