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
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 f5bd18d..5e37d53 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 @@
             }
             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 @@
         }
     }
 
+    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 @@
         if (closed.get())
         {
             throw new SenderException("SSL Sender is closed");
-        }   
+        }
 
         HandshakeStatus handshakeStatus;
         Status status;