java.io.Closeable, java.lang.AutoCloseable, Connectionpublic class SslConnection extends AbstractConnection
Connection like HttpConnection) that
wants unencrypted data.
The connector uses an EndPoint (typically SocketChannelEndPoint) as
it's source/sink of encrypted data. It then provides an endpoint via getDecryptedEndPoint() to
expose a source/sink of unencrypted data to another connection (eg HttpConnection).
The design of this class is based on a clear separation between the passive methods, which do not block nor schedule any asynchronous callbacks, and active methods that do schedule asynchronous callbacks.
The passive methods are SslConnection.DecryptedEndPoint.fill(ByteBuffer) and SslConnection.DecryptedEndPoint.flush(ByteBuffer...). They make best
effort attempts to progress the connection using only calls to the encrypted EndPoint.fill(ByteBuffer) and EndPoint.flush(ByteBuffer...)
methods. They will never block nor schedule any readInterest or write callbacks. If a fill/flush cannot progress either because
of network congestion or waiting for an SSL handshake message, then the fill/flush will simply return with zero bytes filled/flushed.
Specifically, if a flush cannot proceed because it needs to receive a handshake message, then the flush will attempt to fill bytes from the
encrypted endpoint, but if insufficient bytes are read it will NOT call EndPoint.fillInterested(Callback).
It is only the active methods : AbstractEndPoint.fillInterested(Callback) and
AbstractEndPoint.write(Callback, ByteBuffer...) that may schedule callbacks by calling the encrypted
EndPoint.fillInterested(Callback) and EndPoint.write(Callback, ByteBuffer...)
methods. For normal data handling, the decrypted fillInterest method will result in an encrypted fillInterest and a decrypted
write will result in an encrypted write. However, due to SSL handshaking requirements, it is also possible for a decrypted fill
to call the encrypted write and for the decrypted flush to call the encrypted fillInterested methods.
MOST IMPORTANTLY, the encrypted callbacks from the active methods (#onFillable() and WriteFlusher#completeWrite()) do no filling or flushing themselves. Instead they simple make the callbacks to the decrypted callbacks, so that the passive encrypted fill/flush will be called again and make another best effort attempt to progress the connection.
| Modifier and Type | Class | Description |
|---|---|---|
class |
SslConnection.DecryptedEndPoint |
Connection.Listener, Connection.UpgradeFrom, Connection.UpgradeTo| Constructor | Description |
|---|---|
SslConnection(ByteBufferPool byteBufferPool,
java.util.concurrent.Executor executor,
EndPoint endPoint,
javax.net.ssl.SSLEngine sslEngine) |
| Modifier and Type | Method | Description |
|---|---|---|
void |
addHandshakeListener(SslHandshakeListener listener) |
|
void |
close() |
Performs a logical close of this connection.
|
SslConnection.DecryptedEndPoint |
getDecryptedEndPoint() |
|
int |
getRenegotiationLimit() |
|
javax.net.ssl.SSLEngine |
getSSLEngine() |
|
boolean |
isAllowMissingCloseMessage() |
|
boolean |
isRenegotiationAllowed() |
|
protected SslConnection.DecryptedEndPoint |
newDecryptedEndPoint() |
|
void |
onClose() |
Callback method invoked when this connection is closed.
|
void |
onFillable() |
Callback method invoked when the endpoint is ready to be read.
|
void |
onFillInterestedFailed(java.lang.Throwable cause) |
Callback method invoked when the endpoint failed to be ready to be read.
|
boolean |
onIdleExpired() |
Callback method invoked upon an idle timeout event.
|
void |
onOpen() |
Callback method invoked when this connection is opened.
|
boolean |
removeHandshakeListener(SslHandshakeListener listener) |
|
void |
setAllowMissingCloseMessage(boolean allowMissingCloseMessage) |
|
void |
setRenegotiationAllowed(boolean renegotiationAllowed) |
|
void |
setRenegotiationLimit(int renegotiationLimit) |
|
java.lang.String |
toConnectionString() |
addListener, failedCallback, fillInterested, getBytesIn, getBytesOut, getCreatedTimeStamp, getEndPoint, getExecutor, getInputBufferSize, getMessagesIn, getMessagesOut, isFillInterested, onReadTimeout, removeListener, setInputBufferSize, toString, tryFillInterested, tryFillInterestedpublic SslConnection(ByteBufferPool byteBufferPool, java.util.concurrent.Executor executor, EndPoint endPoint, javax.net.ssl.SSLEngine sslEngine)
public void addHandshakeListener(SslHandshakeListener listener)
public boolean removeHandshakeListener(SslHandshakeListener listener)
protected SslConnection.DecryptedEndPoint newDecryptedEndPoint()
public javax.net.ssl.SSLEngine getSSLEngine()
public SslConnection.DecryptedEndPoint getDecryptedEndPoint()
public boolean isRenegotiationAllowed()
public void setRenegotiationAllowed(boolean renegotiationAllowed)
public int getRenegotiationLimit()
public void setRenegotiationLimit(int renegotiationLimit)
renegotiationLimit - The number of renegotions allowed for this connection.
When the limit is 0 renegotiation will be denied. If the limit is less than 0 then no limit is applied.
Default -1.public boolean isAllowMissingCloseMessage()
public void setAllowMissingCloseMessage(boolean allowMissingCloseMessage)
public void onOpen()
ConnectionCallback method invoked when this connection is opened.
Creators of the connection implementation are responsible for calling this method.
onOpen in interface ConnectiononOpen in class AbstractConnectionpublic void onClose()
ConnectionCallback method invoked when this connection is closed.
Creators of the connection implementation are responsible for calling this method.
onClose in interface ConnectiononClose in class AbstractConnectionpublic void close()
ConnectionPerforms a logical close of this connection.
For simple connections, this may just mean to delegate the close to the associated
EndPoint but, for example, SSL connections should write the SSL close message
before closing the associated EndPoint.
close in interface java.lang.AutoCloseableclose in interface java.io.Closeableclose in interface Connectionclose in class AbstractConnectionpublic boolean onIdleExpired()
ConnectionCallback method invoked upon an idle timeout event.
Implementations of this method may return true to indicate that the idle timeout handling should proceed normally, typically failing the EndPoint and causing it to be closed.
When false is returned, the handling of the idle timeout event is halted immediately and the EndPoint left in the state it was before the idle timeout event.
onIdleExpired in interface ConnectiononIdleExpired in class AbstractConnectionpublic void onFillable()
AbstractConnectionCallback method invoked when the endpoint is ready to be read.
onFillable in class AbstractConnectionAbstractConnection.fillInterested()public void onFillInterestedFailed(java.lang.Throwable cause)
AbstractConnectionCallback method invoked when the endpoint failed to be ready to be read.
onFillInterestedFailed in class AbstractConnectioncause - the exception that caused the failurepublic java.lang.String toConnectionString()
toConnectionString in class AbstractConnectionCopyright © 1995–2018 Webtide. All rights reserved.