You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2014/03/14 16:21:26 UTC

svn commit: r1577569 - /tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java

Author: remm
Date: Fri Mar 14 15:21:26 2014
New Revision: 1577569

URL: http://svn.apache.org/r1577569
Log:
Add missing code to retry if no bytes are written (handshake) like for blocking IO, and use EOFException instead.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java?rev=1577569&r1=1577568&r2=1577569&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java Fri Mar 14 15:21:26 2014
@@ -20,7 +20,6 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.AsynchronousSocketChannel;
-import java.nio.channels.ClosedChannelException;
 import java.nio.channels.CompletionHandler;
 import java.nio.channels.WritePendingException;
 import java.util.concurrent.ExecutionException;
@@ -665,7 +664,7 @@ public class SecureNio2Channel extends N
         @Override
         public void completed(Integer nBytes, A attach) {
             if (nBytes.intValue() < 0) {
-                handler.failed(new ClosedChannelException(), attach);
+                handler.failed(new EOFException(), attach);
                 return;
             }
             try {
@@ -734,8 +733,8 @@ public class SecureNio2Channel extends N
     }
 
     @Override
-    public <A> void write(final ByteBuffer src, long timeout, TimeUnit unit, final A attachment,
-            final CompletionHandler<Integer, ? super A> handler) {
+    public <A> void write(final ByteBuffer src, final long timeout, final TimeUnit unit,
+            final A attachment, final CompletionHandler<Integer, ? super A> handler) {
         //are we closing or closed?
         if (closing || closed) {
             handler.failed(new IOException("Channel is in closing state."), attachment);
@@ -746,7 +745,7 @@ public class SecureNio2Channel extends N
             // Prepare the output buffer
             this.netOutBuffer.clear();
             // Wrap the source data into the internal buffer
-            SSLEngineResult result = sslEngine.wrap(bufHandler.getWriteBuffer(), netOutBuffer);
+            SSLEngineResult result = sslEngine.wrap(src, netOutBuffer);
             final int written = result.bytesConsumed();
             netOutBuffer.flip();
             if (result.getStatus() == Status.OK) {
@@ -762,7 +761,9 @@ public class SecureNio2Channel extends N
                 @Override
                 public void completed(Integer nBytes, A attach) {
                     if (nBytes.intValue() < 0) {
-                        handler.failed(new ClosedChannelException(), attach);
+                        handler.failed(new EOFException(), attach);
+                    } else if (written == 0) {
+                        write(src, timeout, unit, attachment, handler);
                     } else {
                         // Call the handler completed method with the
                         // consumed bytes number
@@ -811,7 +812,7 @@ public class SecureNio2Channel extends N
         @Override
         public void completed(Integer nBytes, GatherState<A> attachment) {
             if (nBytes.intValue() < 0) {
-                state.handler.failed(new ClosedChannelException(), state.attachment);
+                state.handler.failed(new EOFException(), state.attachment);
             } else {
                 if (state.pos == state.offset + state.length) {
                     state.handler.completed(Long.valueOf(state.writeCount), state.attachment);
@@ -822,7 +823,8 @@ public class SecureNio2Channel extends N
                     netOutBuffer.clear();
                     // Wrap the source data into the internal buffer
                     SSLEngineResult result = sslEngine.wrap(state.srcs[state.offset], netOutBuffer);
-                    state.writeCount += result.bytesConsumed();
+                    int written = result.bytesConsumed();
+                    state.writeCount += written;
                     netOutBuffer.flip();
                     if (result.getStatus() == Status.OK) {
                         if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
@@ -831,7 +833,9 @@ public class SecureNio2Channel extends N
                         failed(new IOException("Unable to wrap data, invalid engine state: " +result.getStatus()), attachment);
                         return;
                     }
-                    state.offset++;
+                    if (written > 0) {
+                        state.offset++;
+                    }
                     // Write data to the channel
                     sc.write(netOutBuffer, state.timeout, state.unit, state, this);
                 } catch (Throwable exp) {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org