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 Adapter
adapter
protected org.apache.coyote.AsyncStateMachine
asyncStateMachine
protected Request
request
protected Response
response
protected SocketWrapperBase<?>
socketWrapper
protected SSLSupport
sslSupport
protected UserDataHelper
userDataHelper
-
Constructor Summary
Constructors Modifier Constructor Description AbstractProcessor(Adapter adapter)
protected
AbstractProcessor(Adapter adapter, Request coyoteRequest, Response coyoteResponse)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract void
ack(ContinueResponseTiming continueResponseTiming)
void
action(ActionCode actionCode, java.lang.Object param)
Send an action to the connector.AbstractEndpoint.Handler.SocketState
asyncPostProcess()
protected abstract int
available(boolean doRead)
boolean
checkAsyncTimeoutGeneration()
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 void
disableSwallowRequest()
AbstractEndpoint.Handler.SocketState
dispatch(SocketEvent status)
Process an in-progress request that is not longer in standard HTTP mode.protected abstract AbstractEndpoint.Handler.SocketState
dispatchEndRequest()
Perform any necessary clean-up processing if the dispatch resulted in the completion of processing for the current request.protected void
dispatchNonBlockingRead()
Perform any necessary processing for a non-blocking read before dispatching to the adapter.protected void
doHttpUpgrade(UpgradeToken upgradeToken)
Process an HTTP upgrade.protected void
doPush(Request pushTarget)
Process a push.protected void
execute(java.lang.Runnable runnable)
Provides a mechanism to trigger processing on a container thread.protected void
executeDispatches()
protected abstract void
finishResponse()
protected abstract void
flush()
protected abstract boolean
flushBufferedWrite()
Flush any pending writes.Adapter
getAdapter()
Get the associated adapter.long
getAsyncTimeout()
protected java.lang.Object
getConnectionID()
Protocols that support multiplexing (e.g.protected ErrorState
getErrorState()
java.nio.ByteBuffer
getLeftoverInput()
Allows retrieving additional input during the upgrade process.protected boolean
getPopulateRequestAttributesFromSocket()
Processors that populate request attributes directly (e.g.Request
getRequest()
protected SocketWrapperBase<?>
getSocketWrapper()
protected java.lang.Object
getStreamID()
Protocols that support multiplexing (e.g.UpgradeToken
getUpgradeToken()
Generate an upgrade token.boolean
isAsync()
protected boolean
isPushSupported()
Protocols that support push should override this method and returntrue
.protected boolean
isReadyForRead()
protected abstract boolean
isReadyForWrite()
protected abstract boolean
isRequestBodyFullyRead()
protected abstract boolean
isTrailerFieldsReady()
protected boolean
isTrailerFieldsSupported()
Protocols that support trailer fields should override this method and returntrue
.boolean
isUpgrade()
Processors that implement HTTP upgrade must override this method.protected void
logAccess(SocketWrapperBase<?> socketWrapper)
Add an entry to the access log for a failed connection attempt.protected void
parseHost(MessageBytes valueMB)
protected void
populateHost()
Called when a host header is not present in the request (e.g.protected void
populatePort()
Called when a host header is not present or is empty in the request (e.g.protected void
populateRequestAttributeRemoteHost()
Populate the remote host request attribute.protected void
populateSslRequestAttributes()
Populate the TLS related request attributes from theSSLSupport
instance associated with this processor.protected abstract void
prepareResponse()
protected void
processSocketEvent(SocketEvent event, boolean dispatch)
void
recycle()
Recycle the processor, ready for the next request which may be on the same connection or a different connection.protected abstract void
registerReadInterest()
void
setAsyncTimeout(long timeout)
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.protected abstract void
setRequestBody(ByteChunk body)
protected void
setSocketWrapper(SocketWrapperBase<?> socketWrapper)
Set the socket wrapper being used.void
setSslSupport(SSLSupport sslSupport)
Set the SSL information for this HTTP connection.protected abstract void
setSwallowResponse()
protected void
sslReHandShake()
Processors that can perform a TLS re-handshake (e.g.void
timeoutAsync(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
-
asyncStateMachine
protected final org.apache.coyote.AsyncStateMachine asyncStateMachine
-
request
protected final Request request
-
response
protected final Response response
-
socketWrapper
protected volatile SocketWrapperBase<?> socketWrapper
-
sslSupport
protected volatile SSLSupport sslSupport
-
userDataHelper
protected final UserDataHelper userDataHelper
-
-
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()
-
getRequest
public Request getRequest()
- Specified by:
getRequest
in 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()
- Returns:
- the socket wrapper being used.
-
setSslSupport
public final void setSslSupport(SSLSupport sslSupport)
Description copied from interface:Processor
Set the SSL information for this HTTP connection.- Specified by:
setSslSupport
in 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
-
asyncPostProcess
public AbstractEndpoint.Handler.SocketState asyncPostProcess()
- Specified by:
asyncPostProcess
in classAbstractProcessorLight
-
dispatch
public final AbstractEndpoint.Handler.SocketState dispatch(SocketEvent status) throws java.io.IOException
Description copied from class:AbstractProcessorLight
Process an in-progress request that is not 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:
dispatch
in 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)
-
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:ActionHook
Send an action to the connector.- Specified by:
action
in 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.
Sub-classes of this base class represent a single request/response pair. The timeout to be processed is, therefore, the Servlet asynchronous processing timeout.
- Specified by:
timeoutAsync
in 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 ifq it has expired.
-
checkAsyncTimeoutGeneration
public boolean checkAsyncTimeoutGeneration()
Description copied from interface:Processor
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. This is intended to be used to avoid unnecessary processing.- Specified by:
checkAsyncTimeoutGeneration
in interfaceProcessor
- Returns:
true
If the async generation has not changed since the async timeout was triggered
-
setAsyncTimeout
public void setAsyncTimeout(long timeout)
-
getAsyncTimeout
public long getAsyncTimeout()
-
recycle
public void recycle()
Description copied from interface:Processor
Recycle 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.IOException
- Throws:
java.io.IOException
-
finishResponse
protected abstract void finishResponse() throws java.io.IOException
- Throws:
java.io.IOException
-
ack
protected abstract void ack(ContinueResponseTiming continueResponseTiming)
-
flush
protected abstract void flush() throws java.io.IOException
- Throws:
java.io.IOException
-
available
protected abstract int available(boolean doRead)
-
setRequestBody
protected abstract void setRequestBody(ByteChunk body)
-
setSwallowResponse
protected abstract void setSwallowResponse()
-
disableSwallowRequest
protected abstract void disableSwallowRequest()
-
getPopulateRequestAttributesFromSocket
protected boolean getPopulateRequestAttributesFromSocket()
Processors that populate request attributes directly (e.g. AJP) should over-ride this method and returnfalse
.- Returns:
true
if 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 theSSLSupport
instance 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.IOException
Processors 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)
-
isReadyForRead
protected boolean isReadyForRead()
-
isRequestBodyFullyRead
protected abstract boolean isRequestBodyFullyRead()
-
registerReadInterest
protected abstract void registerReadInterest()
-
isReadyForWrite
protected abstract boolean isReadyForWrite()
-
executeDispatches
protected void executeDispatches()
-
getUpgradeToken
public UpgradeToken getUpgradeToken()
Generate an upgrade token. Processors that implement HTTP upgrade must override this method and provide the necessary token.- Specified by:
getUpgradeToken
in 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:
getLeftoverInput
in interfaceProcessor
- Returns:
- leftover bytes
-
isUpgrade
public boolean isUpgrade()
Processors that implement HTTP upgrade must override this method.
-
isPushSupported
protected boolean isPushSupported()
Protocols that support push should override this method and returntrue
.- Returns:
true
if 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()
-
isTrailerFieldsSupported
protected boolean isTrailerFieldsSupported()
Protocols that support trailer fields should override this method and returntrue
.- Returns:
true
if trailer fields are supported by this processor, otherwisefalse
.
-
getConnectionID
protected java.lang.Object getConnectionID()
Protocols that support multiplexing (e.g. HTTP/2) should override this method and return the appropriate ID.- Returns:
- The stream ID associated with this request or
null
if a multiplexing protocol is not being used
-
getStreamID
protected java.lang.Object getStreamID()
Protocols that support multiplexing (e.g. HTTP/2) should override this method and return the appropriate ID.- Returns:
- The stream ID associated with this request or
null
if a multiplexing protocol is not being used
-
flushBufferedWrite
protected abstract boolean flushBufferedWrite() throws java.io.IOException
Flush any pending writes. Used during non-blocking writes to flush any remaining data from a previous incomplete write.- Returns:
true
if 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:AbstractProcessorLight
Add an entry to the access log for a failed connection attempt.- Overrides:
logAccess
in classAbstractProcessorLight
- Parameters:
socketWrapper
- The connection to process- Throws:
java.io.IOException
- If an I/O error occurs during the processing of the request
-
-