You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by ie...@apache.org on 2008/10/02 23:24:42 UTC

svn commit: r701247 - /incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java

Author: ieb
Date: Thu Oct  2 14:24:42 2008
New Revision: 701247

URL: http://svn.apache.org/viewvc?rev=701247&view=rev
Log:
SHINDIG-622

Patch by Adam Winer

Given an HTTP request to concat several resources, if one of those resources is not found, the request terminates at that resource instead of reporting an error and continuing.

Thanks

Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.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=701247&r1=701246&r2=701247&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 Thu Oct  2 14:24:42 2008
@@ -26,6 +26,7 @@
 import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.Locale;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.Cookie;
@@ -67,28 +68,48 @@
           Integer.valueOf(request.getParameter(ProxyBase.REFRESH_PARAM)));
     }
     response.setHeader("Content-Disposition", "attachment;filename=p.txt");
-    ResponseWrapper wrapper = new ResponseWrapper(response);
     for (int i = 1; i < Integer.MAX_VALUE; i++) {
       String url = request.getParameter(Integer.toString(i));
       if (url == null) {
         break;
       }
       try {
-        wrapper.getOutputStream().println("/* ---- Start " + url + " ---- */");
+        response.getOutputStream().println("/* ---- Start " + url + " ---- */");
+
+        ResponseWrapper wrapper = new ResponseWrapper(response);
         proxyHandler.fetch(new RequestWrapper(request, url), wrapper);
-        wrapper.getOutputStream().println("/* ---- End " + url + " ---- */");
+
+        if (wrapper.getStatus() != HttpServletResponse.SC_OK) {
+          response.getOutputStream().println(
+              formatHttpError(wrapper.getStatus(), wrapper.getErrorMessage()));
+        }
+
+        response.getOutputStream().println("/* ---- End " + url + " ---- */");
       } catch (GadgetException ge) {
         if (ge.getCode() != GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT) {
           outputError(ge, url, response);
           return;
         } else {
-          wrapper.getOutputStream().println("/* ---- End " + url + " 404 ---- */");
+          response.getOutputStream().println("/* ---- End " + url + " 404 ---- */");
         }
       }
     }
     response.setStatus(200);
   }
 
+  private String formatHttpError(int status, String errorMessage) {
+    StringBuilder err = new StringBuilder();
+    err.append("/* ---- Error ");
+    err.append(status);
+    if (errorMessage != null) {
+      err.append(", ");
+      err.append(errorMessage);
+    }
+
+    err.append(" ---- */");
+    return err.toString();
+  }
+
   private void outputError(GadgetException excep, String url, HttpServletResponse resp)
       throws IOException {
     StringBuilder err = new StringBuilder();
@@ -133,42 +154,132 @@
 
     private ServletOutputStream outputStream;
 
+    private int errorCode = SC_OK;
+    private String errorMessage;
+
     private ResponseWrapper(HttpServletResponse httpServletResponse) {
       super(httpServletResponse);
     }
 
     @Override
     public ServletOutputStream getOutputStream() throws IOException {
+      // For errors, we don't want the content returned by the remote
+      // server;  we'll just include an HTTP error code to avoid creating
+      // syntactically invalid output overall.
+      if (errorCode != SC_OK) {
+        outputStream = new NullServletOutputStream();
+      }
+
       if (outputStream == null) {
         outputStream = super.getOutputStream();
       }
       return outputStream;
     }
 
+    public int getStatus() {
+      return errorCode;
+    }
+
+    public String getErrorMessage() {
+      return errorMessage;
+    }
+
+    @Override
     public void addCookie(Cookie cookie) {
     }
 
     // Suppress headers
+    @Override
     public void setDateHeader(String s, long l) {
     }
 
+    @Override
     public void addDateHeader(String s, long l) {
     }
 
+    @Override
     public void setHeader(String s, String s1) {
     }
 
+    @Override
     public void addHeader(String s, String s1) {
     }
 
+    @Override
     public void setIntHeader(String s, int i) {
     }
 
+    @Override
     public void addIntHeader(String s, int i) {
     }
 
+    @Override
+    public void sendError(int i, String s) throws IOException {
+      errorCode = i;
+      errorMessage = s;
+    }
+
+    @Override
+    public void sendError(int i) throws IOException {
+      errorCode = i;
+    }
+
+    @Override
+    public void sendRedirect(String s) throws IOException {
+    }
+
+    @Override
     public void setStatus(int i) {
     }
+
+    @Override
+    public void setStatus(int i, String s) {
+    }
+
+    @Override
+    public void setContentLength(int i) {
+    }
+
+    @Override
+    public void setContentType(String s) {
+    }
+
+    @Override
+    public void flushBuffer() throws IOException {
+    }
+
+    @Override
+    public void reset() {
+    }
+
+    @Override
+    public void resetBuffer() {
+    }
+
+    @Override
+    public void setLocale(Locale locale) {
+    }
+
+    @Override
+    public void setCharacterEncoding(String s) {
+    }
+  }
+
+  /**
+   * Small ServletOutputStream class, overriding just enough to ensure
+   * there's no output.
+   */
+  private static class NullServletOutputStream extends ServletOutputStream {
+    public void write(int b) throws IOException {
+    }
+
+    @Override
+    public void write(byte b[], int off, int len) throws IOException {
+    }
+
+    @Override
+    public void write(byte b[]) throws IOException {
+    }
   }
 }