Author: markt Date: Tue Oct 20 09:01:20 2015 New Revision: 1709546 URL: http://svn.apache.org/viewvc?rev=1709546&view=rev Log: Pull up comment processing code
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java tomcat/trunk/java/org/apache/coyote/AbstractProcessorLight.java tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/Processor.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java Tue Oct 20 09:01:20 2015 @@ -22,7 +22,6 @@ import java.util.concurrent.Executor; import javax.servlet.RequestDispatcher; -import org.apache.juli.logging.Log; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; @@ -280,6 +279,4 @@ public abstract class AbstractProcessor * current request has completed */ protected abstract SocketState dispatchEndRequest(); - - protected abstract Log getLog(); } Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessorLight.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProcessorLight.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProcessorLight.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProcessorLight.java Tue Oct 20 09:01:20 2015 @@ -22,7 +22,9 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; +import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.DispatchType; +import org.apache.tomcat.util.net.SocketStatus; import org.apache.tomcat.util.net.SocketWrapperBase; /** @@ -36,9 +38,62 @@ public abstract class AbstractProcessorL @Override - public SocketState process(SocketWrapperBase<?> socketWrapper) throws IOException { - // TODO Auto-generated method stub - return null; + public SocketState process(SocketWrapperBase<?> socketWrapper, SocketStatus status) + throws IOException { + + SocketState state = SocketState.CLOSED; + Iterator<DispatchType> dispatches = null; + do { + if (status == SocketStatus.CLOSE_NOW) { + errorDispatch(); + state = SocketState.CLOSED; + } else if (dispatches != null) { + DispatchType nextDispatch = dispatches.next(); + state = dispatch(nextDispatch.getSocketStatus()); + } else if (status == SocketStatus.DISCONNECT) { + // Do nothing here, just wait for it to get recycled + } else if (isAsync() || isUpgrade()) { + state = dispatch(status); + } else if (state == SocketState.ASYNC_END) { + state = dispatch(status); + // TODO: In case this request takes a long time to process + // remove the TBD (socket/processor/something else) from + // the waiting requests now else the async timeout will + // fire + if (state == SocketState.OPEN) { + // There may be pipe-lined data to read. If the data + // isn't processed now, execution will exit this + // loop and call release() which will recycle the + // processor (and input buffer) deleting any + // pipe-lined data. To avoid this, process it now. + state = service(socketWrapper); + } + } else if (status == SocketStatus.OPEN_WRITE) { + // Extra write event likely after async, ignore + state = SocketState.LONG; + } else { + state = service(socketWrapper); + } + + if (state != SocketState.CLOSED && isAsync()) { + state = asyncPostProcess(); + } + + if (getLog().isDebugEnabled()) { + getLog().debug("Socket: [" + socketWrapper + + "], Status in: [" + status + + "], State out: [" + state + "]"); + } + + if (dispatches == null || !dispatches.hasNext()) { + // Only returns non-null iterator if there are + // dispatches to process. + dispatches = getIteratorAndClearDispatches(); + } + } while (state == SocketState.ASYNC_END || + dispatches != null && state != SocketState.CLOSED); + + return state; } @@ -75,4 +130,7 @@ public abstract class AbstractProcessorL dispatches.clear(); } } + + + protected abstract Log getLog(); } Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Tue Oct 20 09:01:20 2015 @@ -19,7 +19,6 @@ package org.apache.coyote; import java.io.IOException; import java.net.InetAddress; import java.nio.ByteBuffer; -import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; @@ -40,7 +39,6 @@ import org.apache.tomcat.util.collection import org.apache.tomcat.util.modeler.Registry; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler; -import org.apache.tomcat.util.net.DispatchType; import org.apache.tomcat.util.net.SocketStatus; import org.apache.tomcat.util.net.SocketWrapperBase; import org.apache.tomcat.util.res.StringManager; @@ -631,8 +629,7 @@ public abstract class AbstractProtocol<S @Override - public SocketState process(SocketWrapperBase<S> wrapper, - SocketStatus status) { + public SocketState process(SocketWrapperBase<S> wrapper, SocketStatus status) { if (wrapper == null) { // Nothing to do. Socket has been closed. return SocketState.CLOSED; @@ -685,52 +682,16 @@ public abstract class AbstractProtocol<S processor.setSslSupport( wrapper.getSslSupport(getProtocol().getClientCertProvider())); + // Associate the processor with the connection + connections.put(socket, processor); + SocketState state = SocketState.CLOSED; - Iterator<DispatchType> dispatches = null; do { - if (status == SocketStatus.CLOSE_NOW) { - processor.errorDispatch(); - state = SocketState.CLOSED; - } else if (dispatches != null) { - // Associate the processor with the connection as - // these calls may result in a nested call to process() - connections.put(socket, processor); - DispatchType nextDispatch = dispatches.next(); - state = processor.dispatch(nextDispatch.getSocketStatus()); - } else if (status == SocketStatus.DISCONNECT) { - // Do nothing here, just wait for it to get recycled - } else if (processor.isAsync() || processor.isUpgrade()) { - state = processor.dispatch(status); - } else if (state == SocketState.ASYNC_END) { - state = processor.dispatch(status); - // release() won't get called so in case this request - // takes a long time to process remove the socket from - // the waiting requests now else the async timeout will - // fire - getProtocol().getEndpoint().removeWaitingRequest(wrapper); - if (state == SocketState.OPEN) { - // There may be pipe-lined data to read. If the data - // isn't processed now, execution will exit this - // loop and call release() which will recycle the - // processor (and input buffer) deleting any - // pipe-lined data. To avoid this, process it now. - state = processor.service(wrapper); - } - } else if (status == SocketStatus.OPEN_WRITE) { - // Extra write event likely after async, ignore - state = SocketState.LONG; - } else { - state = processor.service(wrapper); - } - - if (state != SocketState.CLOSED && processor.isAsync()) { - state = processor.asyncPostProcess(); - } + state = processor.process(wrapper, status); if (state == SocketState.UPGRADING) { // Get the HTTP upgrade handler - HttpUpgradeHandler httpUpgradeHandler = - processor.getHttpUpgradeHandler(); + HttpUpgradeHandler httpUpgradeHandler = processor.getHttpUpgradeHandler(); // Retrieve leftover input ByteBuffer leftoverInput = processor.getLeftoverInput(); // Release the Http11 processor to be re-used @@ -750,19 +711,7 @@ public abstract class AbstractProtocol<S // it. httpUpgradeHandler.init((WebConnection) processor); } - if (getLog().isDebugEnabled()) { - getLog().debug("Socket: [" + wrapper + - "], Status in: [" + status + - "], State out: [" + state + "]"); - } - if (dispatches == null || !dispatches.hasNext()) { - // Only returns non-null iterator if there are - // dispatches to process. - dispatches = processor.getIteratorAndClearDispatches(); - } - } while (state == SocketState.ASYNC_END || - state == SocketState.UPGRADING || - dispatches != null && state != SocketState.CLOSED); + } while ( state == SocketState.UPGRADING); if (state == SocketState.LONG) { // In the middle of processing a request/response. Keep the @@ -823,8 +772,7 @@ public abstract class AbstractProtocol<S // any other exception or error is odd. Here we log it // with "ERROR" level, so it will show up even on // less-than-verbose logs. - getLog().error( - sm.getString("abstractConnectionHandler.error"), e); + getLog().error(sm.getString("abstractConnectionHandler.error"), e); } finally { ContainerThreadMarker.clear(); } Modified: tomcat/trunk/java/org/apache/coyote/Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Processor.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/Processor.java Tue Oct 20 09:01:20 2015 @@ -43,6 +43,8 @@ public interface Processor { * not currently being processed. * * @param socketWrapper The connection to process + * @param status The status of the connection that triggered this additional + * processing * * @return The state the caller should put the socket in when this method * returns @@ -50,7 +52,7 @@ public interface Processor { * @throws IOException If an I/O error occurs during the processing of the * request */ - SocketState process(SocketWrapperBase<?> socketWrapper) throws IOException; + SocketState process(SocketWrapperBase<?> socketWrapper, SocketStatus status) throws IOException; /** * Service a 'standard' HTTP request. This method is called for both new Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java Tue Oct 20 09:01:20 2015 @@ -55,6 +55,12 @@ public class UpgradeProcessorExternal ex } + @Override + protected Log getLog() { + return log; + } + + // --------------------------------------------------- AutoCloseable methods @Override Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java Tue Oct 20 09:01:20 2015 @@ -23,12 +23,16 @@ import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.SocketStatus; import org.apache.tomcat.util.net.SocketWrapperBase; public class UpgradeProcessorInternal extends UpgradeProcessorBase { + private static final Log log = LogFactory.getLog(UpgradeProcessorInternal.class); + private final InternalHttpUpgradeHandler internalHttpUpgradeHandler; public UpgradeProcessorInternal(SocketWrapperBase<?> wrapper, ByteBuffer leftOverInput, @@ -63,6 +67,12 @@ public class UpgradeProcessorInternal ex } + @Override + protected Log getLog() { + return log; + } + + // --------------------------------------------------- AutoCloseable methods @Override Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Tue Oct 20 09:01:20 2015 @@ -77,8 +77,6 @@ stream.outputBuffer.flush.debug=Connecti streamProcessor.error.connection=Connection [{0}], Stream [{1}], An error occurred during processing that was fatal to the connection streamProcessor.error.stream=Connection [{0}], Stream [{1}], An error occurred during processing that was fatal to the stream streamProcessor.httpupgrade.notsupported=HTTP upgrade is not supported within HTTP/2 streams -streamProcessor.process.loopend=Connection [{0}], Stream [{1}], loop end, state [{2}], dispatches [{3}] -streamProcessor.process.loopstart=Connection [{0}], Stream [{1}], loop start, status [{2}], dispatches [{3}] streamProcessor.ssl.error=Unable to retrieve SSL request attributes streamStateMachine.debug.change=Connection [{0}], Stream [{1}], State changed from [{2}] to [{3}] Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1709546&r1=1709545&r2=1709546&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Tue Oct 20 09:01:20 2015 @@ -18,7 +18,6 @@ package org.apache.coyote.http2; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Iterator; import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.http.HttpUpgradeHandler; @@ -60,51 +59,12 @@ public class StreamProcessor extends Abs @Override public synchronized void run() { - SocketStatus status = SocketStatus.OPEN_READ; - // HTTP/2 equivalent of AbstractConnectionHandler#process() without the // socket <-> processor mapping ContainerThreadMarker.set(); SocketState state = SocketState.CLOSED; try { - Iterator<DispatchType> dispatches = getIteratorAndClearDispatches(); - do { - if (log.isDebugEnabled()) { - log.debug(sm.getString("streamProcessor.process.loopstart", - stream.getConnectionId(), stream.getIdentifier(), status, dispatches)); - } - if (status == SocketStatus.CLOSE_NOW) { - setErrorState(ErrorState.CLOSE_NOW, null); - state = SocketState.CLOSED; - } else if (dispatches != null) { - DispatchType nextDispatch = dispatches.next(); - state = dispatch(nextDispatch.getSocketStatus()); - } else if (isAsync()) { - state = dispatch(status); - } else if (state == SocketState.ASYNC_END) { - state = dispatch(status); - } else if (status == SocketStatus.DISCONNECT) { - // Should never happen - throw new IllegalStateException(); - } else { - state = service((SocketWrapperBase<?>) null); - } - - if (state != SocketState.CLOSED && isAsync()) { - state = asyncStateMachine.asyncPostProcess(); - } - - if (dispatches == null || !dispatches.hasNext()) { - // Only returns non-null iterator if there are - // dispatches to process. - dispatches = getIteratorAndClearDispatches(); - } - if (log.isDebugEnabled()) { - log.debug(sm.getString("streamProcessor.process.loopend", - stream.getConnectionId(), stream.getIdentifier(), state, dispatches)); - } - } while (state == SocketState.ASYNC_END || - dispatches != null && state != SocketState.CLOSED); + state = process(socketWrapper, SocketStatus.OPEN_READ); if (state == SocketState.CLOSED) { if (!getErrorState().isConnectionIoAllowed()) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org