Package org.apache.tomcat.util.net
Class Nio2Endpoint.Nio2SocketWrapper
- java.lang.Object
-
- org.apache.tomcat.util.net.SocketWrapperBase<Nio2Channel>
-
- org.apache.tomcat.util.net.Nio2Endpoint.Nio2SocketWrapper
-
- Enclosing class:
- Nio2Endpoint
public static class Nio2Endpoint.Nio2SocketWrapper extends SocketWrapperBase<Nio2Channel>
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.apache.tomcat.util.net.SocketWrapperBase
SocketWrapperBase.BlockingMode, SocketWrapperBase.CompletionCheck, SocketWrapperBase.CompletionHandlerCall, SocketWrapperBase.CompletionState
-
-
Field Summary
-
Fields inherited from class org.apache.tomcat.util.net.SocketWrapperBase
bufferedWriteSize, COMPLETE_WRITE, COMPLETE_WRITE_WITH_COMPLETION, localAddr, localName, localPort, nonBlockingWriteBuffer, READ_DATA, remoteAddr, remoteHost, remotePort, sm, socketBufferHandler
-
-
Constructor Summary
Constructors Constructor Description Nio2SocketWrapper(Nio2Channel channel, Nio2Endpoint endpoint)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
awaitBytes()
boolean
awaitReadComplete(long timeout, java.util.concurrent.TimeUnit unit)
If an asynchronous read operation is pending, this method will block until the operation completes, or the specified amount of time has passed.boolean
awaitWriteComplete(long timeout, java.util.concurrent.TimeUnit unit)
If an asynchronous write operation is pending, this method will block until the operation completes, or the specified amount of time has passed.void
close()
SendfileDataBase
createSendfileData(java.lang.String filename, long pos, long length)
void
doClientAuth(SSLSupport sslSupport)
Require the client to perform CLIENT-CERT authentication if it hasn't already done so.protected void
doWrite(boolean block, java.nio.ByteBuffer from)
Write the contents of the ByteBuffer to the socket.protected void
flushBlocking()
protected boolean
flushNonBlocking()
Nio2Endpoint.SendfileData
getSendfileData()
SSLSupport
getSslSupport(java.lang.String clientCertProvider)
boolean
hasAsyncIO()
Allows using NIO2 style read/write only for connectors that can efficiently support it.boolean
hasDataToWrite()
boolean
isClosed()
boolean
isReadPending()
Allows checking if an asynchronous read operation is currently pending.boolean
isReadyForRead()
boolean
isWritePending()
Allows checking if an asynchronous write operation is currently pending.protected void
populateLocalAddr()
protected void
populateLocalName()
protected void
populateLocalPort()
protected void
populateRemoteAddr()
protected void
populateRemoteHost()
protected void
populateRemotePort()
SendfileState
processSendfile(SendfileDataBase sendfileData)
Starts the sendfile process.int
read(boolean block, byte[] b, int off, int len)
int
read(boolean block, java.nio.ByteBuffer to)
<A> SocketWrapperBase.CompletionState
read(java.nio.ByteBuffer[] dsts, int offset, int length, SocketWrapperBase.BlockingMode block, long timeout, java.util.concurrent.TimeUnit unit, A attachment, SocketWrapperBase.CompletionCheck check, java.nio.channels.CompletionHandler<java.lang.Long,? super A> handler)
Scatter read.void
registerReadInterest()
void
registerWriteInterest()
void
setAppReadBufHandler(ApplicationBufferHandler handler)
void
setSendfileData(Nio2Endpoint.SendfileData sf)
<A> SocketWrapperBase.CompletionState
write(java.nio.ByteBuffer[] srcs, int offset, int length, SocketWrapperBase.BlockingMode block, long timeout, java.util.concurrent.TimeUnit unit, A attachment, SocketWrapperBase.CompletionCheck check, java.nio.channels.CompletionHandler<java.lang.Long,? super A> handler)
Gather write.protected void
writeNonBlocking(byte[] buf, int off, int len)
Transfers the data to the socket write buffer (writing that data to the socket if the buffer fills up using a non-blocking write) until either all the data has been transferred and space remains in the socket write buffer or a non-blocking write leaves data in the socket write buffer.protected void
writeNonBlocking(java.nio.ByteBuffer from)
Transfers the data to the socket write buffer (writing that data to the socket if the buffer fills up using a non-blocking write) until either all the data has been transferred and space remains in the socket write buffer or a non-blocking write leaves data in the socket write buffer.protected void
writeNonBlockingInternal(java.nio.ByteBuffer from)
Separate method so it can be re-used by the socket write buffer to write data to the network-
Methods inherited from class org.apache.tomcat.util.net.SocketWrapperBase
canWrite, checkError, decrementKeepAlive, doWrite, execute, flush, getBlockingStatus, getBlockingStatusReadLock, getBlockingStatusWriteLock, getEndpoint, getError, getLocalAddr, getLocalName, getLocalPort, getNegotiatedProtocol, getReadTimeout, getRemoteAddr, getRemoteHost, getRemotePort, getSocket, getSocketBufferHandler, getWriteTimeout, isReadyForWrite, isSecure, isUpgraded, populateReadBuffer, populateReadBuffer, processSocket, read, setBlockingStatus, setError, setKeepAliveLeft, setNegotiatedProtocol, setReadTimeout, setSecure, setUpgraded, setWriteTimeout, toString, transfer, transfer, unRead, write, write, write, writeBlocking, writeBlocking, writeBlockingDirect, writeNonBlockingDirect
-
-
-
-
Constructor Detail
-
Nio2SocketWrapper
public Nio2SocketWrapper(Nio2Channel channel, Nio2Endpoint endpoint)
-
-
Method Detail
-
setSendfileData
public void setSendfileData(Nio2Endpoint.SendfileData sf)
-
getSendfileData
public Nio2Endpoint.SendfileData getSendfileData()
-
isReadyForRead
public boolean isReadyForRead() throws java.io.IOException
- Specified by:
isReadyForRead
in classSocketWrapperBase<Nio2Channel>
- Throws:
java.io.IOException
-
read
public int read(boolean block, byte[] b, int off, int len) throws java.io.IOException
- Specified by:
read
in classSocketWrapperBase<Nio2Channel>
- Throws:
java.io.IOException
-
read
public int read(boolean block, java.nio.ByteBuffer to) throws java.io.IOException
- Specified by:
read
in classSocketWrapperBase<Nio2Channel>
- Throws:
java.io.IOException
-
close
public void close() throws java.io.IOException
- Specified by:
close
in classSocketWrapperBase<Nio2Channel>
- Throws:
java.io.IOException
-
isClosed
public boolean isClosed()
- Specified by:
isClosed
in classSocketWrapperBase<Nio2Channel>
-
isWritePending
public boolean isWritePending()
Description copied from class:SocketWrapperBase
Allows checking if an asynchronous write operation is currently pending.- Overrides:
isWritePending
in classSocketWrapperBase<Nio2Channel>
- Returns:
true
if the endpoint supports asynchronous IO and a write operation is being processed asynchronously
-
hasAsyncIO
public boolean hasAsyncIO()
Description copied from class:SocketWrapperBase
Allows using NIO2 style read/write only for connectors that can efficiently support it.- Overrides:
hasAsyncIO
in classSocketWrapperBase<Nio2Channel>
- Returns:
- This default implementation always returns
false
-
read
public <A> SocketWrapperBase.CompletionState read(java.nio.ByteBuffer[] dsts, int offset, int length, SocketWrapperBase.BlockingMode block, long timeout, java.util.concurrent.TimeUnit unit, A attachment, SocketWrapperBase.CompletionCheck check, java.nio.channels.CompletionHandler<java.lang.Long,? super A> handler)
Description copied from class:SocketWrapperBase
Scatter read. The completion handler will be called once some data has been read or an error occurred. If a CompletionCheck object has been provided, the completion handler will only be called if the callHandler method returned true. If no CompletionCheck object has been provided, the default NIO2 behavior is used: the completion handler will be called as soon as some data has been read, even if the read has completed inline.- Overrides:
read
in classSocketWrapperBase<Nio2Channel>
- Type Parameters:
A
- The attachment type- Parameters:
dsts
- buffersoffset
- in the buffer arraylength
- in the buffer arrayblock
- is the blocking mode that will be used for this operationtimeout
- timeout duration for the readunit
- units for the timeout durationattachment
- an object to attach to the I/O operation that will be used when calling the completion handlercheck
- for the IO operation completionhandler
- to call when the IO is complete- Returns:
- the completion state (done, done inline, or still pending)
-
write
public <A> SocketWrapperBase.CompletionState write(java.nio.ByteBuffer[] srcs, int offset, int length, SocketWrapperBase.BlockingMode block, long timeout, java.util.concurrent.TimeUnit unit, A attachment, SocketWrapperBase.CompletionCheck check, java.nio.channels.CompletionHandler<java.lang.Long,? super A> handler)
Description copied from class:SocketWrapperBase
Gather write. The completion handler will be called once some data has been written or an error occurred. If a CompletionCheck object has been provided, the completion handler will only be called if the callHandler method returned true. If no CompletionCheck object has been provided, the default NIO2 behavior is used: the completion handler will be called, even if the write is incomplete and data remains in the buffers, or if the write completed inline.- Overrides:
write
in classSocketWrapperBase<Nio2Channel>
- Type Parameters:
A
- The attachment type- Parameters:
srcs
- buffersoffset
- in the buffer arraylength
- in the buffer arrayblock
- is the blocking mode that will be used for this operationtimeout
- timeout duration for the writeunit
- units for the timeout durationattachment
- an object to attach to the I/O operation that will be used when calling the completion handlercheck
- for the IO operation completionhandler
- to call when the IO is complete- Returns:
- the completion state (done, done inline, or still pending)
-
writeNonBlocking
protected void writeNonBlocking(byte[] buf, int off, int len) throws java.io.IOException
Transfers the data to the socket write buffer (writing that data to the socket if the buffer fills up using a non-blocking write) until either all the data has been transferred and space remains in the socket write buffer or a non-blocking write leaves data in the socket write buffer. After an incomplete write, any data remaining to be transferred to the socket write buffer will be copied to the socket write buffer. If the remaining data is too big for the socket write buffer, the socket write buffer will be filled and the additional data written to the non-blocking write buffer.Overridden for NIO2 to enable a gathering write to be used to write all of the remaining data in a single additional write should a non-blocking write leave data in the buffer.
- Overrides:
writeNonBlocking
in classSocketWrapperBase<Nio2Channel>
- Parameters:
buf
- The byte array containing the data to be writtenoff
- The offset within the byte array of the data to be writtenlen
- The length of the data to be written- Throws:
java.io.IOException
- If an IO error occurs during the write
-
writeNonBlocking
protected void writeNonBlocking(java.nio.ByteBuffer from) throws java.io.IOException
Transfers the data to the socket write buffer (writing that data to the socket if the buffer fills up using a non-blocking write) until either all the data has been transferred and space remains in the socket write buffer or a non-blocking write leaves data in the socket write buffer. After an incomplete write, any data remaining to be transferred to the socket write buffer will be copied to the socket write buffer. If the remaining data is too big for the socket write buffer, the socket write buffer will be filled and the additional data written to the non-blocking write buffer.Overridden for NIO2 to enable a gathering write to be used to write all of the remaining data in a single additional write should a non-blocking write leave data in the buffer.
- Overrides:
writeNonBlocking
in classSocketWrapperBase<Nio2Channel>
- Parameters:
from
- The ByteBuffer containing the data to be written- Throws:
java.io.IOException
- If an IO error occurs during the write
-
writeNonBlockingInternal
protected void writeNonBlockingInternal(java.nio.ByteBuffer from) throws java.io.IOException
Separate method so it can be re-used by the socket write buffer to write data to the networkOverridden for NIO2 to enable a gathering write to be used to write all of the remaining data in a single additional write should a non-blocking write leave data in the buffer.
- Overrides:
writeNonBlockingInternal
in classSocketWrapperBase<Nio2Channel>
- Parameters:
from
- The ByteBuffer containing the data to be written- Throws:
java.io.IOException
- If an IO error occurs during the write
-
doWrite
protected void doWrite(boolean block, java.nio.ByteBuffer from) throws java.io.IOException
Description copied from class:SocketWrapperBase
Write the contents of the ByteBuffer to the socket. For blocking writes either then entire contents of the buffer will be written or an IOException will be thrown. Partial blocking writes will not occur.- Specified by:
doWrite
in classSocketWrapperBase<Nio2Channel>
- Parameters:
block
- Ignored since this method is only called in the blocking casefrom
- the ByteBuffer containing the data to be written- Throws:
java.io.IOException
- If an I/O error such as a timeout occurs during the write
-
flushBlocking
protected void flushBlocking() throws java.io.IOException
- Overrides:
flushBlocking
in classSocketWrapperBase<Nio2Channel>
- Throws:
java.io.IOException
-
flushNonBlocking
protected boolean flushNonBlocking() throws java.io.IOException
- Overrides:
flushNonBlocking
in classSocketWrapperBase<Nio2Channel>
- Throws:
java.io.IOException
-
hasDataToWrite
public boolean hasDataToWrite()
- Overrides:
hasDataToWrite
in classSocketWrapperBase<Nio2Channel>
-
isReadPending
public boolean isReadPending()
Description copied from class:SocketWrapperBase
Allows checking if an asynchronous read operation is currently pending.- Overrides:
isReadPending
in classSocketWrapperBase<Nio2Channel>
- Returns:
true
if the endpoint supports asynchronous IO and a read operation is being processed asynchronously
-
awaitReadComplete
public boolean awaitReadComplete(long timeout, java.util.concurrent.TimeUnit unit)
Description copied from class:SocketWrapperBase
If an asynchronous read operation is pending, this method will block until the operation completes, or the specified amount of time has passed.- Overrides:
awaitReadComplete
in classSocketWrapperBase<Nio2Channel>
- Parameters:
timeout
- The maximum amount of time to waitunit
- The unit for the timeout- Returns:
true
if the read operation is complete,false
if the operation is still pending and the specified timeout has passed
-
awaitWriteComplete
public boolean awaitWriteComplete(long timeout, java.util.concurrent.TimeUnit unit)
Description copied from class:SocketWrapperBase
If an asynchronous write operation is pending, this method will block until the operation completes, or the specified amount of time has passed.- Overrides:
awaitWriteComplete
in classSocketWrapperBase<Nio2Channel>
- Parameters:
timeout
- The maximum amount of time to waitunit
- The unit for the timeout- Returns:
true
if the read operation is complete,false
if the operation is still pending and the specified timeout has passed
-
registerReadInterest
public void registerReadInterest()
- Specified by:
registerReadInterest
in classSocketWrapperBase<Nio2Channel>
-
registerWriteInterest
public void registerWriteInterest()
- Specified by:
registerWriteInterest
in classSocketWrapperBase<Nio2Channel>
-
awaitBytes
public void awaitBytes()
-
createSendfileData
public SendfileDataBase createSendfileData(java.lang.String filename, long pos, long length)
- Specified by:
createSendfileData
in classSocketWrapperBase<Nio2Channel>
-
processSendfile
public SendfileState processSendfile(SendfileDataBase sendfileData)
Description copied from class:SocketWrapperBase
Starts the sendfile process. It is expected that if the sendfile process does not complete during this call and does not report an error, that the caller will not add the socket to the poller (or equivalent). That is the responsibility of this method.- Specified by:
processSendfile
in classSocketWrapperBase<Nio2Channel>
- Parameters:
sendfileData
- Data representing the file to send- Returns:
- The state of the sendfile process after the first write.
-
populateRemoteAddr
protected void populateRemoteAddr()
- Specified by:
populateRemoteAddr
in classSocketWrapperBase<Nio2Channel>
-
populateRemoteHost
protected void populateRemoteHost()
- Specified by:
populateRemoteHost
in classSocketWrapperBase<Nio2Channel>
-
populateRemotePort
protected void populateRemotePort()
- Specified by:
populateRemotePort
in classSocketWrapperBase<Nio2Channel>
-
populateLocalName
protected void populateLocalName()
- Specified by:
populateLocalName
in classSocketWrapperBase<Nio2Channel>
-
populateLocalAddr
protected void populateLocalAddr()
- Specified by:
populateLocalAddr
in classSocketWrapperBase<Nio2Channel>
-
populateLocalPort
protected void populateLocalPort()
- Specified by:
populateLocalPort
in classSocketWrapperBase<Nio2Channel>
-
getSslSupport
public SSLSupport getSslSupport(java.lang.String clientCertProvider)
- Specified by:
getSslSupport
in classSocketWrapperBase<Nio2Channel>
- Parameters:
clientCertProvider
- Ignored for this implementation
-
doClientAuth
public void doClientAuth(SSLSupport sslSupport) throws java.io.IOException
Description copied from class:SocketWrapperBase
Require the client to perform CLIENT-CERT authentication if it hasn't already done so.- Specified by:
doClientAuth
in classSocketWrapperBase<Nio2Channel>
- Parameters:
sslSupport
- The SSL/TLS support instance currently being used by the connection that may need updating after the client authentication- 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
-
setAppReadBufHandler
public void setAppReadBufHandler(ApplicationBufferHandler handler)
- Specified by:
setAppReadBufHandler
in classSocketWrapperBase<Nio2Channel>
-
-