From 218960268571fec8cddcde323b1a4c7e38c0baca Mon Sep 17 00:00:00 2001 From: Rajith Muditha Attapattu Date: Tue, 13 Jan 2009 17:29:17 +0000 Subject: This is a fix for QPID-1571 After M4 release we should probably revisit the SSL close logic. The current fix was done with causing as less impact as possible on the tested code paths. git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/M4-RCs@734193 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/transport/network/ssl/SSLSender.java | 44 ++++++++++++++++++++-- 1 file 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 } 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 } } + 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 if (closed.get()) { throw new SenderException("SSL Sender is closed"); - } + } HandshakeStatus handshakeStatus; Status status; -- cgit v1.2.1