Package org.apache.coyote.http2
Class Http2AsyncUpgradeHandler
- java.lang.Object
-
- org.apache.coyote.http2.Http2AsyncUpgradeHandler
-
- All Implemented Interfaces:
HttpUpgradeHandler
,InternalHttpUpgradeHandler
public class Http2AsyncUpgradeHandler extends java.lang.Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected class
Http2AsyncUpgradeHandler.AsyncPingManager
protected class
Http2AsyncUpgradeHandler.SendfileCompletionHandler
-
Field Summary
Fields Modifier and Type Field Description protected java.util.concurrent.atomic.AtomicInteger
activeRemoteStreamCount
protected java.lang.String
connectionId
protected static int
FLAG_END_OF_HEADERS
protected static int
FLAG_END_OF_STREAM
protected static byte[]
GOAWAY
protected org.apache.coyote.http2.ConnectionSettingsLocal
localSettings
Local settings are settings defined by Tomcat and sent to the client that the client must use when communicating with Tomcat.protected static Log
log
protected static byte[]
PING
protected static byte[]
PING_ACK
protected Http2Protocol
protocol
protected static byte[]
SETTINGS_ACK
protected static StringManager
sm
protected SocketWrapperBase<?>
socketWrapper
protected UserDataHelper
userDataHelper
-
Constructor Summary
Constructors Constructor Description Http2AsyncUpgradeHandler(Http2Protocol protocol, Adapter adapter, Request coyoteRequest)
-
Method Summary
All Methods Instance Methods Concrete Methods Default Methods Modifier and Type Method Description protected byte[]
createWindowUpdateForSettings()
void
destroy()
This method is called after the upgraded connection has been closed.protected org.apache.coyote.http2.Http2UpgradeHandler.HeaderFrameBuffers
doWriteHeaders(org.apache.coyote.http2.Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize)
void
endRequestBodyFrame(int streamId, int dataLength)
default boolean
fill(boolean block, byte[] data)
boolean
fill(boolean block, byte[] data, int offset, int length)
default boolean
fill(boolean block, java.nio.ByteBuffer data, int len)
protected java.lang.String
getConnectionId()
protected org.apache.coyote.http2.Http2UpgradeHandler.HeaderFrameBuffers
getHeaderFrameBuffers(int initialPayloadSize)
HpackDecoder
getHpackDecoder()
protected org.apache.coyote.http2.HpackEncoder
getHpackEncoder()
int
getMaxFrameSize()
protected org.apache.coyote.http2.Http2Parser
getParser(java.lang.String connectionId)
protected org.apache.coyote.http2.Http2UpgradeHandler.PingManager
getPingManager()
protected int
getWeight()
void
goaway(int lastStreamId, long errorCode, java.lang.String debugData)
protected void
handleAppInitiatedIOException(java.io.IOException ioe)
boolean
hasAsyncIO()
void
headersContinue(int payloadSize, boolean endOfHeaders)
void
headersEnd(int streamId)
org.apache.coyote.http2.HpackDecoder.HeaderEmitter
headersStart(int streamId, boolean headersEndStream)
protected void
incrementWindowSize(int increment)
void
incrementWindowSize(int streamId, int increment)
void
init(WebConnection webConnection)
This method is called once the request/response pair whereHttpServletRequest.upgrade(Class)
is called has completed processing and is the point where control of the connection passes from the container to theHttpUpgradeHandler
.void
onSwallowedDataFramePayload(int streamId, int swallowedDataBytesCount)
void
onSwallowedUnknownFrame(int streamId, int frameTypeId, int flags, int size)
void
pause()
void
pingReceive(byte[] payload, boolean ack)
protected void
processConnection(WebConnection webConnection, org.apache.coyote.http2.Stream stream)
protected SendfileState
processSendfile(org.apache.coyote.http2.SendfileData sendfile)
Process send file (if supported) for the given stream.protected void
processStreamOnContainerThread(org.apache.coyote.http2.Stream stream)
protected void
processWrites()
void
receivedEndOfStream(int streamId)
void
reprioritise(int streamId, int parentStreamId, boolean exclusive, int weight)
void
reset(int streamId, long errorCode)
protected void
setConnectionTimeoutForStreamCount(int streamCount)
void
setSocketWrapper(SocketWrapperBase<?> wrapper)
void
setSslSupport(SSLSupport sslSupport)
void
setting(org.apache.coyote.http2.Setting setting, long value)
void
settingsEnd(boolean ack)
java.nio.ByteBuffer
startRequestBodyFrame(int streamId, int payloadSize, boolean endOfStream)
void
timeoutAsync(long now)
AbstractEndpoint.Handler.SocketState
upgradeDispatch(SocketEvent status)
protected void
writeGoAwayFrame(int maxStreamId, long errorCode, byte[] debugMsg)
protected void
writeSettings()
Write the initial settings frame and any necessary supporting frames.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler
getUpgradeInfo
-
-
-
-
Field Detail
-
log
protected static final Log log
-
sm
protected static final StringManager sm
-
FLAG_END_OF_STREAM
protected static final int FLAG_END_OF_STREAM
- See Also:
- Constant Field Values
-
FLAG_END_OF_HEADERS
protected static final int FLAG_END_OF_HEADERS
- See Also:
- Constant Field Values
-
PING
protected static final byte[] PING
-
PING_ACK
protected static final byte[] PING_ACK
-
SETTINGS_ACK
protected static final byte[] SETTINGS_ACK
-
GOAWAY
protected static final byte[] GOAWAY
-
connectionId
protected final java.lang.String connectionId
-
protocol
protected final Http2Protocol protocol
-
socketWrapper
protected volatile SocketWrapperBase<?> socketWrapper
-
localSettings
protected final org.apache.coyote.http2.ConnectionSettingsLocal localSettings
Local settings are settings defined by Tomcat and sent to the client that the client must use when communicating with Tomcat.
-
activeRemoteStreamCount
protected final java.util.concurrent.atomic.AtomicInteger activeRemoteStreamCount
-
userDataHelper
protected final UserDataHelper userDataHelper
-
-
Constructor Detail
-
Http2AsyncUpgradeHandler
public Http2AsyncUpgradeHandler(Http2Protocol protocol, Adapter adapter, Request coyoteRequest)
-
-
Method Detail
-
getParser
protected org.apache.coyote.http2.Http2Parser getParser(java.lang.String connectionId)
-
getPingManager
protected org.apache.coyote.http2.Http2UpgradeHandler.PingManager getPingManager()
-
hasAsyncIO
public boolean hasAsyncIO()
-
processConnection
protected void processConnection(WebConnection webConnection, org.apache.coyote.http2.Stream stream)
-
writeSettings
protected void writeSettings()
Write the initial settings frame and any necessary supporting frames. If the initial settings increase the initial window size, it will also be necessary to send a WINDOW_UPDATE frame to increase the size of the flow control window for the connection (stream 0).
-
writeGoAwayFrame
protected void writeGoAwayFrame(int maxStreamId, long errorCode, byte[] debugMsg) throws java.io.IOException
- Throws:
java.io.IOException
-
getHeaderFrameBuffers
protected org.apache.coyote.http2.Http2UpgradeHandler.HeaderFrameBuffers getHeaderFrameBuffers(int initialPayloadSize)
-
settingsEnd
public void settingsEnd(boolean ack) throws java.io.IOException
- Throws:
java.io.IOException
-
processSendfile
protected SendfileState processSendfile(org.apache.coyote.http2.SendfileData sendfile)
Process send file (if supported) for the given stream. The appropriate request attributes should be set before calling this method.- Parameters:
sendfile
- The stream and associated data to process- Returns:
- The result of the send file processing
-
init
public void init(WebConnection webConnection)
Description copied from interface:jakarta.servlet.http.HttpUpgradeHandler
This method is called once the request/response pair whereHttpServletRequest.upgrade(Class)
is called has completed processing and is the point where control of the connection passes from the container to theHttpUpgradeHandler
.- Specified by:
init
in interfaceHttpUpgradeHandler
- Parameters:
webConnection
- The connection that has been upgraded
-
processStreamOnContainerThread
protected void processStreamOnContainerThread(org.apache.coyote.http2.Stream stream)
-
setSocketWrapper
public void setSocketWrapper(SocketWrapperBase<?> wrapper)
- Specified by:
setSocketWrapper
in interfaceInternalHttpUpgradeHandler
-
setSslSupport
public void setSslSupport(SSLSupport sslSupport)
- Specified by:
setSslSupport
in interfaceInternalHttpUpgradeHandler
-
upgradeDispatch
public AbstractEndpoint.Handler.SocketState upgradeDispatch(SocketEvent status)
- Specified by:
upgradeDispatch
in interfaceInternalHttpUpgradeHandler
-
setConnectionTimeoutForStreamCount
protected void setConnectionTimeoutForStreamCount(int streamCount)
-
timeoutAsync
public void timeoutAsync(long now)
- Specified by:
timeoutAsync
in interfaceInternalHttpUpgradeHandler
-
pause
public void pause()
- Specified by:
pause
in interfaceInternalHttpUpgradeHandler
-
destroy
public void destroy()
Description copied from interface:jakarta.servlet.http.HttpUpgradeHandler
This method is called after the upgraded connection has been closed.- Specified by:
destroy
in interfaceHttpUpgradeHandler
-
createWindowUpdateForSettings
protected byte[] createWindowUpdateForSettings()
- Returns:
- The WINDOW_UPDATE frame if one is required or an empty array if no WINDOW_UPDATE is required.
-
doWriteHeaders
protected org.apache.coyote.http2.Http2UpgradeHandler.HeaderFrameBuffers doWriteHeaders(org.apache.coyote.http2.Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) throws java.io.IOException
- Throws:
java.io.IOException
-
getHpackEncoder
protected org.apache.coyote.http2.HpackEncoder getHpackEncoder()
-
handleAppInitiatedIOException
protected void handleAppInitiatedIOException(java.io.IOException ioe) throws java.io.IOException
- Throws:
java.io.IOException
-
processWrites
protected void processWrites() throws java.io.IOException
- Throws:
java.io.IOException
-
incrementWindowSize
protected void incrementWindowSize(int increment) throws org.apache.coyote.http2.Http2Exception
- Throws:
org.apache.coyote.http2.Http2Exception
-
getConnectionId
protected final java.lang.String getConnectionId()
-
getWeight
protected final int getWeight()
-
fill
public boolean fill(boolean block, byte[] data, int offset, int length) throws java.io.IOException
- Throws:
java.io.IOException
-
getMaxFrameSize
public int getMaxFrameSize()
-
getHpackDecoder
public HpackDecoder getHpackDecoder()
-
startRequestBodyFrame
public java.nio.ByteBuffer startRequestBodyFrame(int streamId, int payloadSize, boolean endOfStream) throws org.apache.coyote.http2.Http2Exception
- Throws:
org.apache.coyote.http2.Http2Exception
-
endRequestBodyFrame
public void endRequestBodyFrame(int streamId, int dataLength) throws org.apache.coyote.http2.Http2Exception, java.io.IOException
- Throws:
org.apache.coyote.http2.Http2Exception
java.io.IOException
-
receivedEndOfStream
public void receivedEndOfStream(int streamId) throws org.apache.coyote.http2.ConnectionException
- Throws:
org.apache.coyote.http2.ConnectionException
-
onSwallowedDataFramePayload
public void onSwallowedDataFramePayload(int streamId, int swallowedDataBytesCount) throws java.io.IOException
- Throws:
java.io.IOException
-
headersStart
public org.apache.coyote.http2.HpackDecoder.HeaderEmitter headersStart(int streamId, boolean headersEndStream) throws org.apache.coyote.http2.Http2Exception, java.io.IOException
- Throws:
org.apache.coyote.http2.Http2Exception
java.io.IOException
-
reprioritise
public void reprioritise(int streamId, int parentStreamId, boolean exclusive, int weight) throws org.apache.coyote.http2.Http2Exception
- Throws:
org.apache.coyote.http2.Http2Exception
-
headersContinue
public void headersContinue(int payloadSize, boolean endOfHeaders)
-
headersEnd
public void headersEnd(int streamId) throws org.apache.coyote.http2.Http2Exception
- Throws:
org.apache.coyote.http2.Http2Exception
-
reset
public void reset(int streamId, long errorCode) throws org.apache.coyote.http2.Http2Exception
- Throws:
org.apache.coyote.http2.Http2Exception
-
setting
public void setting(org.apache.coyote.http2.Setting setting, long value) throws org.apache.coyote.http2.ConnectionException
- Throws:
org.apache.coyote.http2.ConnectionException
-
pingReceive
public void pingReceive(byte[] payload, boolean ack) throws java.io.IOException
- Throws:
java.io.IOException
-
goaway
public void goaway(int lastStreamId, long errorCode, java.lang.String debugData)
-
incrementWindowSize
public void incrementWindowSize(int streamId, int increment) throws org.apache.coyote.http2.Http2Exception
- Throws:
org.apache.coyote.http2.Http2Exception
-
onSwallowedUnknownFrame
public void onSwallowedUnknownFrame(int streamId, int frameTypeId, int flags, int size) throws java.io.IOException
- Throws:
java.io.IOException
-
fill
public default boolean fill(boolean block, byte[] data) throws java.io.IOException
- Throws:
java.io.IOException
-
fill
public default boolean fill(boolean block, java.nio.ByteBuffer data, int len) throws java.io.IOException
- Throws:
java.io.IOException
-
-