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 { + } } }