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