summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpid/transport/network/ssl/SSLSender.java44
1 files changed, 41 insertions, 3 deletions
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/ssl/SSLSender.java b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/ssl/SSLSender.java
index f5bd18d848..5e37d5356b 100644
--- a/qpid/java/common/src/main/java/org/apache/qpid/transport/network/ssl/SSLSender.java
+++ b/qpid/java/common/src/main/java/org/apache/qpid/transport/network/ssl/SSLSender.java
@@ -62,8 +62,15 @@ public class SSLSender implements Sender<ByteBuffer>
}
log.debug("Closing SSL connection");
engine.closeOutbound();
- send(ByteBuffer.allocate(0));
- flush();
+ try
+ {
+ tearDownSSLConnection();
+ }
+ catch(Exception e)
+ {
+ throw new RuntimeException("Error closing SSL connection",e);
+ }
+
while (!engine.isOutboundDone())
{
synchronized(engineState)
@@ -82,6 +89,37 @@ public class SSLSender implements Sender<ByteBuffer>
}
}
+ private void tearDownSSLConnection() throws Exception
+ {
+ SSLEngineResult result = engine.wrap(ByteBuffer.allocate(0), netData);
+ Status status = result.getStatus();
+ int read = result.bytesProduced();
+ while (status != Status.CLOSED)
+ {
+ if (status == Status.BUFFER_OVERFLOW)
+ {
+ netData.clear();
+ }
+ if(read > 0)
+ {
+ int limit = netData.limit();
+ netData.limit(netData.position());
+ netData.position(netData.position() - read);
+
+ ByteBuffer data = netData.slice();
+
+ netData.limit(limit);
+ netData.position(netData.position() + read);
+
+ delegate.send(data);
+ flush();
+ }
+ result = engine.wrap(ByteBuffer.allocate(0), netData);
+ status = result.getStatus();
+ read = result.bytesProduced();
+ }
+ }
+
public void flush()
{
delegate.flush();
@@ -92,7 +130,7 @@ public class SSLSender implements Sender<ByteBuffer>
if (closed.get())
{
throw new SenderException("SSL Sender is closed");
- }
+ }
HandshakeStatus handshakeStatus;
Status status;