You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/04/07 18:42:21 UTC
svn commit: r1790614 - in /tomcat/trunk: java/org/apache/catalina/
java/org/apache/catalina/connector/ java/org/apache/catalina/core/
webapps/docs/
Author: markt
Date: Fri Apr 7 18:42:21 2017
New Revision: 1790614
URL: http://svn.apache.org/viewvc?rev=1790614&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=59825
Log a message that lists the components in the processing chain that do not support async processing when a call to ServletRequest.startAsync() fails.
Modified:
tomcat/trunk/java/org/apache/catalina/Pipeline.java
tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
tomcat/trunk/java/org/apache/catalina/connector/Request.java
tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
tomcat/trunk/java/org/apache/catalina/core/StandardPipeline.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/catalina/Pipeline.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Pipeline.java?rev=1790614&r1=1790613&r2=1790614&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Pipeline.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Pipeline.java Fri Apr 7 18:42:21 2017
@@ -16,6 +16,8 @@
*/
package org.apache.catalina;
+import java.util.Set;
+
/**
* <p>Interface describing a collection of Valves that should be executed
* in sequence when the <code>invoke()</code> method is invoked. It is
@@ -119,4 +121,15 @@ public interface Pipeline extends Contai
* @return true if all the valves in this pipeline support async, false otherwise
*/
public boolean isAsyncSupported();
+
+
+ /**
+ * Identifies the Valves, if any, in this Pipeline that do not support
+ * async.
+ *
+ * @param result The Set to which the fully qualified class names of each
+ * Valve in this Pipeline that does not support async will be
+ * added
+ */
+ public void findNonAsyncValves(Set<String> result);
}
Modified: tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1790614&r1=1790613&r2=1790614&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties Fri Apr 7 18:42:21 2017
@@ -52,7 +52,9 @@ coyoteRequest.authenticate.ise=Cannot ca
coyoteRequest.uploadLocationInvalid=The temporary upload location [{0}] is not valid
coyoteRequest.sessionEndAccessFail=Exception triggered ending access to session while recycling request
coyoteRequest.sendfileNotCanonical=Unable to determine canonical name of file [{0}] specified for use with sendfile
+coyoteRequest.filterAsyncSupportUnknown=Unable to determine if any filters do not support async processing
coyoteRequest.maxPostSizeExceeded=The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector
+coyoteRequest.noAsync=Unable to start async because the following classes in the processing chain do not support async [{0}]
coyoteRequest.noMultipartConfig=Unable to process parts as no multi-part configuration has been provided
coyoteResponse.getOutputStream.ise=getWriter() has already been called for this response
Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1790614&r1=1790613&r2=1790614&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri Apr 7 18:42:21 2017
@@ -76,6 +76,7 @@ import org.apache.catalina.Realm;
import org.apache.catalina.Session;
import org.apache.catalina.TomcatPrincipal;
import org.apache.catalina.Wrapper;
+import org.apache.catalina.core.ApplicationFilterChain;
import org.apache.catalina.core.ApplicationMapping;
import org.apache.catalina.core.ApplicationPart;
import org.apache.catalina.core.ApplicationPushBuilder;
@@ -95,6 +96,7 @@ import org.apache.tomcat.util.ExceptionU
import org.apache.tomcat.util.buf.B2CConverter;
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.buf.MessageBytes;
+import org.apache.tomcat.util.buf.StringUtils;
import org.apache.tomcat.util.buf.UDecoder;
import org.apache.tomcat.util.http.CookieProcessor;
import org.apache.tomcat.util.http.FastHttpDateFormat;
@@ -1617,7 +1619,11 @@ public class Request implements HttpServ
public AsyncContext startAsync(ServletRequest request,
ServletResponse response) {
if (!isAsyncSupported()) {
- throw new IllegalStateException(sm.getString("request.asyncNotSupported"));
+ IllegalStateException ise =
+ new IllegalStateException(sm.getString("request.asyncNotSupported"));
+ log.warn(sm.getString("coyoteRequest.noAsync",
+ StringUtils.join(getNonAsyncClassNames())), ise);
+ throw ise;
}
if (asyncContext == null) {
@@ -1631,6 +1637,31 @@ public class Request implements HttpServ
return asyncContext;
}
+
+ private Set<String> getNonAsyncClassNames() {
+ Set<String> result = new HashSet<>();
+
+ Wrapper wrapper = getWrapper();
+ if (!wrapper.isAsyncSupported()) {
+ result.add(wrapper.getServletClass());
+ }
+
+ FilterChain filterChain = getFilterChain();
+ if (filterChain instanceof ApplicationFilterChain) {
+ ((ApplicationFilterChain) filterChain).findNonAsyncFilters(result);
+ } else {
+ result.add(sm.getString("coyoteRequest.filterAsyncSupportUnknown"));
+ }
+
+ Container c = wrapper;
+ while (c != null) {
+ c.getPipeline().findNonAsyncValves(result);
+ c = c.getParent();
+ }
+
+ return result;
+ }
+
@Override
public boolean isAsyncStarted() {
if (asyncContext == null) {
Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java?rev=1790614&r1=1790613&r2=1790614&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java Fri Apr 7 18:42:21 2017
@@ -19,6 +19,7 @@ package org.apache.catalina.core;
import java.io.IOException;
import java.security.Principal;
import java.security.PrivilegedActionException;
+import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
@@ -43,7 +44,7 @@ import org.apache.tomcat.util.res.String
*
* @author Craig R. McClanahan
*/
-final class ApplicationFilterChain implements FilterChain {
+public final class ApplicationFilterChain implements FilterChain {
// Used to enforce requirements of SRV.8.2 / SRV.14.2.5.1
private static final ThreadLocal<ServletRequest> lastServicedRequest;
@@ -326,4 +327,22 @@ final class ApplicationFilterChain imple
void setServletSupportsAsync(boolean servletSupportsAsync) {
this.servletSupportsAsync = servletSupportsAsync;
}
+
+
+ /**
+ * Identifies the Filters, if any, in this FilterChain that do not support
+ * async.
+ *
+ * @param result The Set to which the fully qualified class names of each
+ * Filter in this FilterChain that does not support async will
+ * be added
+ */
+ public void findNonAsyncFilters(Set<String> result) {
+ for (int i = 0; i < n ; i++) {
+ ApplicationFilterConfig filter = filters[i];
+ if ("false".equalsIgnoreCase(filter.getFilterDef().getAsyncSupported())) {
+ result.add(filter.getFilterClass());
+ }
+ }
+ }
}
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardPipeline.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardPipeline.java?rev=1790614&r1=1790613&r2=1790614&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardPipeline.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardPipeline.java Fri Apr 7 18:42:21 2017
@@ -20,6 +20,7 @@ package org.apache.catalina.core;
import java.util.ArrayList;
+import java.util.Set;
import javax.management.ObjectName;
@@ -117,8 +118,19 @@ public class StandardPipeline extends Li
}
- // ------------------------------------------------------ Contained Methods
+ @Override
+ public void findNonAsyncValves(Set<String> result) {
+ Valve valve = (first!=null) ? first : basic;
+ while (valve != null) {
+ if (!valve.isAsyncSupported()) {
+ result.add(valve.getClass().getName());
+ }
+ valve = valve.getNext();
+ }
+ }
+
+ // ------------------------------------------------------ Contained Methods
/**
* Return the Container with which this Pipeline is associated.
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1790614&r1=1790613&r2=1790614&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Apr 7 18:42:21 2017
@@ -69,6 +69,11 @@
classes are given explit names rather than being anonymous. (markt)
</fix>
<fix>
+ <bug>59825</bug>: Log a message that lists the components in the
+ processing chain that do not support async processing when a call to
+ <code>ServletRequest.startAsync()</code> fails. (markt)
+ </fix>
+ <fix>
<bug>60940</bug>: Improve the handling of the <code>META-INF/</code> and
<code>META-INF/MANIFEST.MF</code> entries for Jar files located in
<code>/WEB-INF/lib</code> when running a web application from a packed
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org