Author: markt Date: Wed Nov 4 10:55:12 2015 New Revision: 1712529 URL: http://svn.apache.org/viewvc?rev=1712529&view=rev Log: Follow-up to r1712081. Comet is not-blocking too, so it also needs to trigger a read on a call to available() if no bytes are in the buffer
Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1712529&r1=1712528&r2=1712529&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Wed Nov 4 10:55:12 2015 @@ -519,15 +519,11 @@ public class CoyoteAdapter implements Ad if (request.isComet()) { if (!response.isClosed() && !response.isError()) { + comet = true; + res.action(ActionCode.COMET_BEGIN, null); if (request.getAvailable() || (request.getContentLength() > 0 && (!request.isParametersParsed()))) { // Invoke a read event right away if there are available bytes - if (event(req, res, SocketStatus.OPEN_READ)) { - comet = true; - res.action(ActionCode.COMET_BEGIN, null); - } - } else { - comet = true; - res.action(ActionCode.COMET_BEGIN, null); + event(req, res, SocketStatus.OPEN_READ); } } else { // Clear the filter chain, as otherwise it will not be reset elsewhere @@ -535,8 +531,8 @@ public class CoyoteAdapter implements Ad request.setFilterChain(null); } } - } + AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext(); if (asyncConImpl != null) { async = true; Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712529&r1=1712528&r2=1712529&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java Wed Nov 4 10:55:12 2015 @@ -22,6 +22,7 @@ import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.ReadListener; @@ -241,7 +242,14 @@ public class InputBuffer extends Reader available = cb.getLength(); } if (available == 0) { - coyoteRequest.action(ActionCode.AVAILABLE, Boolean.valueOf(coyoteRequest.getReadListener() != null)); + // Written this way to avoid use of IS_COMET action where possible + boolean readForAvailable = coyoteRequest.getReadListener() != null; + if (!readForAvailable) { + AtomicBoolean isComet = new AtomicBoolean(); + coyoteRequest.action(ActionCode.IS_COMET, isComet); + readForAvailable = isComet.get(); + } + coyoteRequest.action(ActionCode.AVAILABLE, Boolean.valueOf(readForAvailable)); available = (coyoteRequest.getAvailable() > 0) ? 1 : 0; } return available; Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=1712529&r1=1712528&r2=1712529&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/StandardWrapperValve.java Wed Nov 4 10:55:12 2015 @@ -181,9 +181,6 @@ final class StandardWrapperValve ApplicationFilterChain filterChain = ApplicationFilterFactory.createFilterChain(request, wrapper, servlet); - // Reset comet flag value after creating the filter chain - request.setComet(false); - // Call the filter chain for this request // NOTE: This also calls the servlet's service() method try { @@ -196,7 +193,6 @@ final class StandardWrapperValve ((AsyncContextImpl)request.getAsyncContext()).doInternalDispatch(); } else if (comet) { filterChain.doFilterEvent(request.getEvent()); - request.setComet(true); } else { filterChain.doFilter(request.getRequest(), response.getResponse()); @@ -211,7 +207,6 @@ final class StandardWrapperValve if (request.isAsyncDispatching()) { ((AsyncContextImpl)request.getAsyncContext()).doInternalDispatch(); } else if (comet) { - request.setComet(true); filterChain.doFilterEvent(request.getEvent()); } else { filterChain.doFilter Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java?rev=1712529&r1=1712528&r2=1712529&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/ActionCode.java Wed Nov 4 10:55:12 2015 @@ -135,6 +135,11 @@ public enum ActionCode { COMET_SETTIMEOUT, /** + * Callback to determine if the current request is a Comet request. + */ + IS_COMET, + + /** * Callback for an async request. */ ASYNC_START, Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1712529&r1=1712528&r2=1712529&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Wed Nov 4 10:55:12 2015 @@ -617,6 +617,11 @@ public abstract class AbstractAjpProcess throw new UnsupportedOperationException( sm.getString("ajpprocessor.comet.notsupported")); } + case IS_COMET: { + // HTTP connections only. Unsupported for AJP. + throw new UnsupportedOperationException( + sm.getString("ajpprocessor.comet.notsupported")); + } case AVAILABLE: { if (available()) { request.setAvailable(1); Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1712529&r1=1712528&r2=1712529&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Wed Nov 4 10:55:12 2015 @@ -920,6 +920,11 @@ public abstract class AbstractHttp11Proc endRequest(); break; } + case IS_COMET: { + AtomicBoolean result = (AtomicBoolean) param; + result.set(isComet()); + break; + } default: { actionInternal(actionCode, param); break; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org