* Set the multi-part configuration for the associated servlet. To clear the
* multi-part configuration specify <code>null</code> as the new value.
*/
- public void setMultipartConfigElement(MultipartConfigElement multipartConfig);
+ public void setMultipartConfigElement(
+ MultipartConfigElement multipartConfig);
+
+ /**
+ * Does the associated Servlet support async processing? Defaults to
+ * <code>true</code>
+ */
+ public boolean isAsyncSupported();
+
+ /**
+ * Set the async support for the associated servlet.
+ */
+ public void setAsyncSupported(boolean asyncSupport);
}
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestWrapper;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Globals;
support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
servlet, request, response);
- if ((request instanceof HttpServletRequest) &&
+ ServletRequest wRequest;
+ if (request.isAsyncSupported()
+ && !support.getWrapper().isAsyncSupported()) {
+ if (request instanceof HttpServletRequest) {
+ wRequest = new HttpServletRequestNoAsyc(
+ (HttpServletRequest) request);
+ } else {
+ // Must be a ServletRequest
+ wRequest = new ServletRequestNoAsyc(request);
+ }
+ } else {
+ wRequest = request;
+ }
+ // Use potentially wrapped request from this point
+ if ((wRequest instanceof HttpServletRequest) &&
(response instanceof HttpServletResponse)) {
if( Globals.IS_SECURITY_ENABLED ) {
- final ServletRequest req = request;
+ final ServletRequest req = wRequest;
final ServletResponse res = response;
Principal principal =
((HttpServletRequest) req).getUserPrincipal();
principal);
args = null;
} else {
- servlet.service(request, response);
+ servlet.service(wRequest, response);
}
} else {
- servlet.service(request, response);
+ servlet.service(wRequest, response);
}
+ // Stop using wrapped request now Servlet has been processed
support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
servlet, request, response);
} catch (IOException e) {
}
+ // --------------------------------- Wrapper classes for isAsyncSupported()
+
+ private class HttpServletRequestNoAsyc extends HttpServletRequestWrapper {
+
+ public HttpServletRequestNoAsyc(HttpServletRequest request) {
+ super(request);
+ }
+
+ @Override
+ public boolean isAsyncSupported() {
+ return false;
+ }
+ }
+
+ private class ServletRequestNoAsyc extends ServletRequestWrapper {
+
+ public ServletRequestNoAsyc(ServletRequest request) {
+ super(request);
+ }
+
+ @Override
+ public boolean isAsyncSupported() {
+ return false;
+ }
+ }
+
}
* Multipart config
*/
protected MultipartConfigElement multipartConfigElement = null;
+
+ /**
+ * Async support
+ */
+ protected boolean asyncSupported = true;
/**
* Static class array used when the SecurityManager is turned on and
this.multipartConfigElement = multipartConfigElement;
}
+ @Override
+ public boolean isAsyncSupported() {
+ return asyncSupported;
+ }
+
+ public void setAsyncSupported(boolean asyncSupported) {
+ this.asyncSupported = asyncSupported;
+ }
+
// -------------------------------------------------------- Package Methods
public void setMultipartDef(MultipartDef multipartDef) {
this.multipartDef = multipartDef;
}
+
+
+ /**
+ * Does this servlet support async.
+ */
+ private String asyncSupported = null;
+
+ public String getAsyncSupported() {
+ return this.asyncSupported;
+ }
+
+ public void setAsyncSupported(String asyncSupported) {
+ this.asyncSupported = asyncSupported;
+ }
}
digester.addCallMethod(fullPrefix + "/servlet/multipart-config/file-size-threshold",
"setFileSizeThreshold", 0);
+ digester.addCallMethod(fullPrefix + "/servlet/async-supported",
+ "setAsyncSupported", 0);
+
+
digester.addRule(fullPrefix + "/servlet-mapping",
new CallMethodMultiRule("addServletMapping", 2, 0));
digester.addCallParam(fullPrefix + "/servlet-mapping/servlet-name", 1);
package org.apache.catalina.startup;
-import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.MultipartConfigElement;
-import javax.servlet.ServletContext;
import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
// messageDestinations were ignored in Tomcat 6, so ignore here
- // TODO SERVLET3 - This needs to be more fine-grained. Whether or not to
- // process annotations on destroy() will depend on where
- // the filter/servlet was loaded from. Joy.
context.setIgnoreAnnotations(metadataComplete);
for (String extension : mimeMappings.keySet()) {
context.addMimeMapping(extension, mimeMappings.get(extension));
multipartdef.getLocation()));
}
}
+ if (servlet.getAsyncSupported() != null) {
+ wrapper.setAsyncSupported(
+ Boolean.parseBoolean(servlet.getAsyncSupported()));
+ }
context.addChild(wrapper);
}
for (String pattern : servletMappings.keySet()) {
dest.getMultipartDef(), failOnConflict);
}
+ if (dest.getAsyncSupported() == null) {
+ dest.setAsyncSupported(src.getAsyncSupported());
+ } else if (src.getAsyncSupported() != null) {
+ if (failOnConflict &&
+ !src.getAsyncSupported().equals(dest.getAsyncSupported())) {
+ return false;
+ }
+ }
+
return true;
}