Package org.apache.coyote
Class AbstractProcessor
- java.lang.Object
-
- org.apache.coyote.AbstractProcessorLight
-
- org.apache.coyote.AbstractProcessor
-
- All Implemented Interfaces:
ActionHook,Processor
- Direct Known Subclasses:
AjpProcessor,Http11Processor
public abstract class AbstractProcessor extends AbstractProcessorLight implements ActionHook
Provides functionality and attributes common to all supported protocols (currently HTTP and AJP) for processing a single request/response.
-
-
Field Summary
Fields Modifier and Type Field Description protected AdapteradapterThe adapter for this processor.protected org.apache.coyote.AsyncStateMachineasyncStateMachineState machine for async processing.protected RequestrequestThe request being processed.protected ResponseresponseThe response being processed.protected SocketWrapperBase<?>socketWrapperThe socket wrapper for this processor.protected SSLSupportsslSupportSSL support for this connection.protected UserDataHelperuserDataHelperUser data helper for logging.
-
Constructor Summary
Constructors Modifier Constructor Description AbstractProcessor(Adapter adapter)Creates a new processor with the given adapter.protectedAbstractProcessor(Adapter adapter, Request coyoteRequest, Response coyoteResponse)Constructs a new processor with the given adapter, request, and response.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract voidack(ContinueResponseTiming continueResponseTiming)Process acknowledgment of the request.voidaction(ActionCode actionCode, java.lang.Object param)Send an action to the connector.AbstractEndpoint.Handler.SocketStateasyncPostProcess()Calls the post process of the async state machine.protected abstract intavailable(boolean doRead)Queries if bytes are available in buffers.booleancheckAsyncTimeoutGeneration()Check to see if the async generation (each cycle of async increments the generation of the AsyncStateMachine) is the same as the generation when the most recent async timeout was triggered.protected abstract voiddisableSwallowRequest()Swallowing bytes is required for pipelining requests, so this allows to avoid doing extra operations in case an error occurs and the connection is to be closed instead.AbstractEndpoint.Handler.SocketStatedispatch(SocketEvent status)Process an in-progress request that is no longer in standard HTTP mode.protected abstract AbstractEndpoint.Handler.SocketStatedispatchEndRequest()Perform any necessary clean-up processing if the dispatch resulted in the completion of processing for the current request.protected voiddispatchNonBlockingRead()Perform any necessary processing for a non-blocking read before dispatching to the adapter.protected voiddoHttpUpgrade(UpgradeToken upgradeToken)Process an HTTP upgrade.protected voiddoPush(Request pushTarget)Process a push.protected abstract voidearlyHints()Process early hints (103 Early Hints).protected voidexecute(java.lang.Runnable runnable)Provides a mechanism to trigger processing on a container thread.protected voidexecuteDispatches()Executes any pending non-blocking dispatches.protected abstract voidfinishResponse()Finish the current response.protected abstract voidflush()Callback to write data from the buffer.protected abstract booleanflushBufferedWrite()Flush any pending writes.AdaptergetAdapter()Get the associated adapter.longgetAsyncTimeout()Gets the async timeout.protected ErrorStategetErrorState()Gets the current error state.java.nio.ByteBuffergetLeftoverInput()Allows retrieving additional input during the upgrade process.protected booleangetPopulateRequestAttributesFromSocket()Processors that populate request attributes directly (e.g.protected java.lang.ObjectgetProtocolRequestId()Protocols that provide per HTTP request IDs (e.g.RequestgetRequest()Gets the request associated with this processor.protected abstract ServletConnectiongetServletConnection()Protocols must override this method and return an appropriate ServletConnection instanceprotected SocketWrapperBase<?>getSocketWrapper()Get the socket wrapper being used.UpgradeTokengetUpgradeToken()Generate an upgrade token.booleanisAsync()Checks if the Processor is in async state.protected booleanisPushSupported()Protocols that support push should override this method and returntrue.protected booleanisReadyForRead()Checks if the processor is ready for reading.protected abstract booleanisReadyForWrite()Checks if the processor is ready for writing.protected abstract booleanisRequestBodyFullyRead()Checks if the request body has been fully read.protected abstract booleanisTrailerFieldsReady()Checks if trailer fields are ready.protected booleanisTrailerFieldsSupported()Protocols that support trailer fields should override this method and returntrue.booleanisUpgrade()Checks if the Processor is processing an upgrade request.protected voidlogAccess(SocketWrapperBase<?> socketWrapper)Add an entry to the access log for a failed connection attempt.protected voidparseHost(MessageBytes valueMB)Parses the Host header value and populates the server name and port.protected voidpopulateHost()Called when a host header is not present in the request (e.g.protected voidpopulatePort()Called when a host header is not present or is empty in the request (e.g.protected voidpopulateRequestAttributeRemoteHost()Populate the remote host request attribute.protected voidpopulateSslRequestAttributes()Populate the TLS related request attributes from theSSLSupportinstance associated with this processor.protected abstract voidprepareResponse()When committing the response, we have to validate the set of headers, as well as set up the response filters.protected voidprocessSocketEvent(SocketEvent event, boolean dispatch)Processes a socket event.voidrecycle()Recycle the processor, ready for the next request which may be on the same connection or a different connection.protected abstract voidregisterReadInterest()When using non blocking IO, register to get a callback when polling determines that bytes are available for reading.voidsetAsyncTimeout(long timeout)Sets the async timeout.protected voidsetErrorState(ErrorState errorState, java.lang.Throwable t)Update the current error state to the new error state if the new error state is more severe than the current error state.protected abstract voidsetRequestBody(ByteChunk body)Set the specified byte chunk as the request body that will be read.protected voidsetSocketWrapper(SocketWrapperBase<?> socketWrapper)Set the socket wrapper being used.voidsetSslSupport(SSLSupport sslSupport)Set the SSL information for this HTTP connection.protected abstract voidsetSwallowResponse()The response is finished and no additional bytes need to be sent to the client.protected voidsslReHandShake()Processors that can perform a TLS re-handshake (e.g.voidtimeoutAsync(long now)Check this processor to see if the timeout has expired and process a timeout if that is that case.-
Methods inherited from class org.apache.coyote.AbstractProcessorLight
addDispatch, clearDispatches, getIteratorAndClearDispatches, getLog, process, service
-
-
-
-
Field Detail
-
adapter
protected final Adapter adapter
The adapter for this processor.
-
asyncStateMachine
protected final org.apache.coyote.AsyncStateMachine asyncStateMachine
State machine for async processing.
-
request
protected final Request request
The request being processed.
-
response
protected final Response response
The response being processed.
-
socketWrapper
protected volatile SocketWrapperBase<?> socketWrapper
The socket wrapper for this processor.
-
sslSupport
protected volatile SSLSupport sslSupport
SSL support for this connection.
-
userDataHelper
protected final UserDataHelper userDataHelper
User data helper for logging.
-
-
Constructor Detail
-
AbstractProcessor
public AbstractProcessor(Adapter adapter)
Creates a new processor with the given adapter.- Parameters:
adapter- The adapter for this processor
-
AbstractProcessor
protected AbstractProcessor(Adapter adapter, Request coyoteRequest, Response coyoteResponse)
Constructs a new processor with the given adapter, request, and response.- Parameters:
adapter- The adapter for this processorcoyoteRequest- The coyote requestcoyoteResponse- The coyote response
-
-
Method Detail
-
setErrorState
protected void setErrorState(ErrorState errorState, java.lang.Throwable t)
Update the current error state to the new error state if the new error state is more severe than the current error state.- Parameters:
errorState- The error status detailst- The error which occurred
-
getErrorState
protected ErrorState getErrorState()
Gets the current error state.- Returns:
- the current error state
-
getRequest
public Request getRequest()
Description copied from interface:ProcessorGets the request associated with this processor.- Specified by:
getRequestin interfaceProcessor- Returns:
- The request associated with this processor.
-
getAdapter
public Adapter getAdapter()
Get the associated adapter.- Returns:
- the associated adapter
-
setSocketWrapper
protected void setSocketWrapper(SocketWrapperBase<?> socketWrapper)
Set the socket wrapper being used.- Parameters:
socketWrapper- The socket wrapper
-
getSocketWrapper
protected final SocketWrapperBase<?> getSocketWrapper()
Get the socket wrapper being used.- Returns:
- the socket wrapper being used.
-
setSslSupport
public final void setSslSupport(SSLSupport sslSupport)
Description copied from interface:ProcessorSet the SSL information for this HTTP connection.- Specified by:
setSslSupportin interfaceProcessor- Parameters:
sslSupport- The SSL support object to use for this connection
-
execute
protected void execute(java.lang.Runnable runnable)
Provides a mechanism to trigger processing on a container thread.- Parameters:
runnable- The task representing the processing that needs to take place on a container thread
-
isAsync
public boolean isAsync()
Description copied from interface:ProcessorChecks if the Processor is in async state.
-
asyncPostProcess
public AbstractEndpoint.Handler.SocketState asyncPostProcess()
Description copied from class:AbstractProcessorLightCalls the post process of the async state machine.- Specified by:
asyncPostProcessin classAbstractProcessorLight- Returns:
- The state the caller should put the socket in when this method returns
-
dispatch
public final AbstractEndpoint.Handler.SocketState dispatch(SocketEvent status) throws java.io.IOException
Description copied from class:AbstractProcessorLightProcess an in-progress request that is no longer in standard HTTP mode. Uses currently include Servlet 3.0 Async and HTTP upgrade connections. Further uses may be added in the future. These will typically start as HTTP requests.- Specified by:
dispatchin classAbstractProcessorLight- Parameters:
status- The event to process- Returns:
- The state the caller should put the socket in when this method returns
- Throws:
java.io.IOException- If an I/O error occurs during the processing of the request
-
parseHost
protected void parseHost(MessageBytes valueMB)
Parses the Host header value and populates the server name and port.- Parameters:
valueMB- The MessageBytes containing the Host header value
-
populateHost
protected void populateHost()
Called when a host header is not present in the request (e.g. HTTP/1.0). It populates the server name with appropriate information. The source is expected to vary by protocol.The default implementation is a NO-OP.
-
populatePort
protected void populatePort()
Called when a host header is not present or is empty in the request (e.g. HTTP/1.0). It populates the server port with appropriate information. The source is expected to vary by protocol.The default implementation is a NO-OP.
-
action
public final void action(ActionCode actionCode, java.lang.Object param)
Description copied from interface:ActionHookSend an action to the connector.- Specified by:
actionin interfaceActionHook- Parameters:
actionCode- Type of the actionparam- Action parameter
-
dispatchNonBlockingRead
protected void dispatchNonBlockingRead()
Perform any necessary processing for a non-blocking read before dispatching to the adapter.
-
timeoutAsync
public void timeoutAsync(long now)
Check this processor to see if the timeout has expired and process a timeout if that is that case.Note: The name of this method originated with the Servlet 3.0 asynchronous processing but evolved over time to represent a timeout that is triggered independently of the socket read/write timeouts.
Subclasses of this base class represent a single request/response pair. The timeout to be processed is, therefore, the Servlet asynchronous processing timeout.
- Specified by:
timeoutAsyncin interfaceProcessor- Parameters:
now- The time (as returned bySystem.currentTimeMillis()) to use as the current time to determine whether the timeout has expired. If negative, the timeout will always be treated as if it has expired.
-
checkAsyncTimeoutGeneration
public boolean checkAsyncTimeoutGeneration()
Description copied from interface:ProcessorCheck to see if the async generation (each cycle of async increments the generation of the AsyncStateMachine) is the same as the generation when the most recent async timeout was triggered. This is intended to be used to avoid unnecessary processing.- Specified by:
checkAsyncTimeoutGenerationin interfaceProcessor- Returns:
trueIf the async generation has not changed since the async timeout was triggered
-
setAsyncTimeout
public void setAsyncTimeout(long timeout)
Sets the async timeout.- Parameters:
timeout- The timeout in milliseconds
-
getAsyncTimeout
public long getAsyncTimeout()
Gets the async timeout.- Returns:
- the async timeout in milliseconds
-
recycle
public void recycle()
Description copied from interface:ProcessorRecycle the processor, ready for the next request which may be on the same connection or a different connection.
-
prepareResponse
protected abstract void prepareResponse() throws java.io.IOExceptionWhen committing the response, we have to validate the set of headers, as well as set up the response filters.- Throws:
java.io.IOException- IO exception during commit
-
finishResponse
protected abstract void finishResponse() throws java.io.IOExceptionFinish the current response.- Throws:
java.io.IOException- IO exception during the write
-
ack
protected abstract void ack(ContinueResponseTiming continueResponseTiming)
Process acknowledgment of the request.- Parameters:
continueResponseTiming- specifies when an acknowledgment should be sent
-
earlyHints
protected abstract void earlyHints() throws java.io.IOExceptionProcess early hints (103 Early Hints).- Throws:
java.io.IOException- IO exception during processing
-
flush
protected abstract void flush() throws java.io.IOExceptionCallback to write data from the buffer.- Throws:
java.io.IOException- IO exception during the write
-
available
protected abstract int available(boolean doRead)
Queries if bytes are available in buffers.- Parameters:
doRead-trueto perform a read when no bytes are availble- Returns:
- the amount of bytes that are known to be available
-
setRequestBody
protected abstract void setRequestBody(ByteChunk body)
Set the specified byte chunk as the request body that will be read. This allows saving and processing requests.- Parameters:
body- the byte chunk containing all the request bytes
-
setSwallowResponse
protected abstract void setSwallowResponse()
The response is finished and no additional bytes need to be sent to the client.
-
disableSwallowRequest
protected abstract void disableSwallowRequest()
Swallowing bytes is required for pipelining requests, so this allows to avoid doing extra operations in case an error occurs and the connection is to be closed instead.
-
getPopulateRequestAttributesFromSocket
protected boolean getPopulateRequestAttributesFromSocket()
Processors that populate request attributes directly (e.g. AJP) should over-ride this method and returnfalse.- Returns:
trueif the SocketWrapper should be used to populate the request attributes, otherwisefalse.
-
populateRequestAttributeRemoteHost
protected void populateRequestAttributeRemoteHost()
Populate the remote host request attribute. Processors (e.g. AJP) that populate this from an alternative source should override this method.
-
populateSslRequestAttributes
protected void populateSslRequestAttributes()
Populate the TLS related request attributes from theSSLSupportinstance associated with this processor. Protocols that populate TLS attributes from a different source (e.g. AJP) should override this method.
-
sslReHandShake
protected void sslReHandShake() throws java.io.IOExceptionProcessors that can perform a TLS re-handshake (e.g. HTTP/1.1) should override this method and implement the re-handshake.- Throws:
java.io.IOException- If authentication is required then there will be I/O with the client and this exception will be thrown if that goes wrong
-
processSocketEvent
protected void processSocketEvent(SocketEvent event, boolean dispatch)
Processes a socket event.- Parameters:
event- The socket event to processdispatch-trueto dispatch to a container thread
-
isReadyForRead
protected boolean isReadyForRead()
Checks if the processor is ready for reading.- Returns:
trueif there is data available or read interest is registered
-
isRequestBodyFullyRead
protected abstract boolean isRequestBodyFullyRead()
Checks if the request body has been fully read.- Returns:
trueif it is known that the request body has been fully read
-
registerReadInterest
protected abstract void registerReadInterest()
When using non blocking IO, register to get a callback when polling determines that bytes are available for reading.
-
isReadyForWrite
protected abstract boolean isReadyForWrite()
Checks if the processor is ready for writing.- Returns:
trueif bytes can be written without blocking
-
executeDispatches
protected void executeDispatches()
Executes any pending non-blocking dispatches.
-
getUpgradeToken
public UpgradeToken getUpgradeToken()
Generate an upgrade token. Processors that implement HTTP upgrade must override this method and provide the necessary token.- Specified by:
getUpgradeTokenin interfaceProcessor- Returns:
- An upgrade token encapsulating the information required to process the upgrade request
-
doHttpUpgrade
protected void doHttpUpgrade(UpgradeToken upgradeToken)
Process an HTTP upgrade. Processors that support HTTP upgrade should override this method and process the provided token.- Parameters:
upgradeToken- Contains all the information necessary for the Processor to process the upgrade- Throws:
java.lang.UnsupportedOperationException- if the protocol does not support HTTP upgrade
-
getLeftoverInput
public java.nio.ByteBuffer getLeftoverInput()
Allows retrieving additional input during the upgrade process. Processors that implement HTTP upgrade must override this method.- Specified by:
getLeftoverInputin interfaceProcessor- Returns:
- leftover bytes
-
isUpgrade
public boolean isUpgrade()
Checks if the Processor is processing an upgrade request. Processors that implement HTTP upgrade must override this method.
-
isPushSupported
protected boolean isPushSupported()
Protocols that support push should override this method and returntrue.- Returns:
trueif push is supported by this processor, otherwisefalse.
-
doPush
protected void doPush(Request pushTarget)
Process a push. Processors that support push should override this method and process the provided token.- Parameters:
pushTarget- Contains all the information necessary for the Processor to process the push request- Throws:
java.lang.UnsupportedOperationException- if the protocol does not support push
-
isTrailerFieldsReady
protected abstract boolean isTrailerFieldsReady()
Checks if trailer fields are ready.- Returns:
trueif trailer fields are ready
-
isTrailerFieldsSupported
protected boolean isTrailerFieldsSupported()
Protocols that support trailer fields should override this method and returntrue.- Returns:
trueif trailer fields are supported by this processor, otherwisefalse.
-
getProtocolRequestId
protected java.lang.Object getProtocolRequestId()
Protocols that provide per HTTP request IDs (e.g. Stream ID for HTTP/2) should override this method and return the appropriate ID.- Returns:
- The ID associated with this request or the empty string if no such ID is defined
-
getServletConnection
protected abstract ServletConnection getServletConnection()
Protocols must override this method and return an appropriate ServletConnection instance- Returns:
- the ServletConnection instance associated with the current request.
-
flushBufferedWrite
protected abstract boolean flushBufferedWrite() throws java.io.IOExceptionFlush any pending writes. Used during non-blocking writes to flush any remaining data from a previous incomplete write.- Returns:
trueif data remains to be flushed at the end of method- Throws:
java.io.IOException- If an I/O error occurs while attempting to flush the data
-
dispatchEndRequest
protected abstract AbstractEndpoint.Handler.SocketState dispatchEndRequest() throws java.io.IOException
Perform any necessary clean-up processing if the dispatch resulted in the completion of processing for the current request.- Returns:
- The state to return for the socket once the clean-up for the current request has completed
- Throws:
java.io.IOException- If an I/O error occurs while attempting to end the request
-
logAccess
protected final void logAccess(SocketWrapperBase<?> socketWrapper) throws java.io.IOException
Description copied from class:AbstractProcessorLightAdd an entry to the access log for a failed connection attempt.- Overrides:
logAccessin classAbstractProcessorLight- Parameters:
socketWrapper- The connection to process- Throws:
java.io.IOException- If an I/O error occurs during the processing of the request
-
-