You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2008/03/15 15:22:53 UTC
svn commit: r637417 -
/cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java
Author: gkossakowski
Date: Sat Mar 15 07:22:51 2008
New Revision: 637417
URL: http://svn.apache.org/viewvc?rev=637417&view=rev
Log:
COCOON-2150: Switch to HttpServletResponseBufferingWrapper in order to correctly handle response resets.
This commit cleans up conditions for resetting the response. SSF should reset previous response only if there is a super servlet and response has NOT_FOUND (404) as status code.
Modified:
cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java
Modified: cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java?rev=637417&r1=637416&r2=637417&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java (original)
+++ cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java Sat Mar 15 07:22:51 2008
@@ -41,15 +41,10 @@
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
import org.apache.cocoon.servletservice.util.ServletContextWrapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.excalibur.source.Source;
-import org.apache.excalibur.source.SourceResolver;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* @version $Id$
@@ -451,8 +446,7 @@
protected void forward(ServletRequest request, ServletResponse response, boolean superCall)
throws ServletException, IOException {
try {
- StatusRetrievableWrappedResponse wrappedResponse = new StatusRetrievableWrappedResponse(
- (HttpServletResponse) response);
+ HttpServletResponseBufferingWrapper wrappedResponse = new HttpServletResponseBufferingWrapper((HttpServletResponse)response);
// FIXME: I think that Cocoon should always set status code on
// its own
wrappedResponse.setStatus(HttpServletResponse.SC_OK);
@@ -471,26 +465,17 @@
wrappedResponse);
}
- ServletException se = null;
- try {
- ServletServiceContext.this.servlet.service(request, wrappedResponse);
- } catch (ServletException e) {
- se = e;
- }
+ ServletServiceContext.this.servlet.service(request, wrappedResponse);
- int status = wrappedResponse.getStatus();
- if (se != null || (status < 200 || status >= 400)) {
- wrappedResponse.reset();
- NamedDispatcher _super = (NamedDispatcher) ServletServiceContext.this.getNamedDispatcher(SUPER);
- if (_super != null) {
- _super.forward(request, wrappedResponse);
- } else {
- wrappedResponse.getWriter().println("Resource not found");
- wrappedResponse.setStatus(HttpServletResponse.SC_NOT_FOUND);
- throw se;
- }
+ int status = wrappedResponse.getStatusCode();
+ NamedDispatcher _super = (NamedDispatcher) ServletServiceContext.this.getNamedDispatcher(SUPER);
+ if (status == HttpServletResponse.SC_NOT_FOUND && _super != null) {
+ //if servlet returned NOT_FOUND (404) and has super servlet declared let's reset everything and ask the super servlet
+ wrappedResponse.resetBufferedResponse();
+ _super.forward(request, response);
+ } else {
+ wrappedResponse.flushBufferedResponse();
}
-
} finally {
CallStackHelper.leaveServlet();
}
@@ -499,39 +484,6 @@
public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException {
throw new UnsupportedOperationException();
}
- }
-
- public static class StatusRetrievableWrappedResponse extends HttpServletResponseWrapper {
-
- private int status;
-
- public StatusRetrievableWrappedResponse(HttpServletResponse wrapped) {
- super(wrapped);
- }
-
- public void setStatus(int sc, String sm) {
- this.status = sc;
- super.setStatus(sc, sm);
- }
-
- public void setStatus(int sc) {
- this.status = sc;
- super.setStatus(sc);
- }
-
- public int getStatus() {
- return this.status;
- }
-
- public void sendError(int errorCode) throws IOException {
- this.status = errorCode;
- super.sendError(errorCode);
- }
-
- public void sendError(int errorCode, String errorMessage) throws IOException {
- this.status = errorCode;
- super.sendError(errorCode, errorMessage);
- }
}
}