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/04/08 01:19:27 UTC

svn commit: r1585616 - in /tomcat/trunk/java/org/apache: coyote/http11/InternalNio2OutputBuffer.java coyote/http11/upgrade/Nio2ServletInputStream.java coyote/http11/upgrade/Nio2ServletOutputStream.java tomcat/util/net/SecureNio2Channel.java

Author: remm
Date: Mon Apr  7 23:19:27 2014
New Revision: 1585616

URL: http://svn.apache.org/r1585616
Log:
Minor cleanups, improve logic (less returns) and possibly fix a scenario where failed could be called twice in SSL.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java
    tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletInputStream.java
    tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletOutputStream.java
    tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java

Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java?rev=1585616&r1=1585615&r2=1585616&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java Mon Apr  7 23:19:27 2014
@@ -50,9 +50,7 @@ public class InternalNio2OutputBuffer ex
      * Default constructor.
      */
     public InternalNio2OutputBuffer(Response response, int headerBufferSize) {
-
         super(response, headerBufferSize);
-
         outputStreamOutputBuffer = new SocketOutputBuffer();
     }
 

Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletInputStream.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletInputStream.java?rev=1585616&r1=1585615&r2=1585616&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletInputStream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletInputStream.java Mon Apr  7 23:19:27 2014
@@ -183,7 +183,6 @@ public class Nio2ServletInputStream exte
                     }
                 }
             } else if (nRead == -1) {
-                // TODO i18n
                 throw new EOFException();
             }
 

Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletOutputStream.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletOutputStream.java?rev=1585616&r1=1585615&r2=1585616&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletOutputStream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2ServletOutputStream.java Mon Apr  7 23:19:27 2014
@@ -51,7 +51,6 @@ public class Nio2ServletOutputStream ext
             public void completed(Integer nBytes, ByteBuffer attachment) {
                 if (nBytes.intValue() < 0) {
                     failed(new EOFException(), attachment);
-                    return;
                 } else if (attachment.hasRemaining()) {
                     channel.write(attachment, socketWrapper.getTimeout(),
                             TimeUnit.MILLISECONDS, attachment, completionHandler);

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=1585616&r1=1585615&r2=1585616&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java Mon Apr  7 23:19:27 2014
@@ -61,7 +61,7 @@ public class SecureNio2Channel extends N
     private CompletionHandler<Integer, SocketWrapper<Nio2Channel>> handshakeWriteCompletionHandler;
 
     public SecureNio2Channel(SSLEngine engine, ApplicationBufferHandler bufHandler,
-            Nio2Endpoint endpoint0) throws IOException {
+            Nio2Endpoint endpoint0) {
         super(bufHandler);
         sslEngine = engine;
         endpoint = endpoint0;
@@ -726,49 +726,46 @@ public class SecureNio2Channel extends N
         @Override
         public void completed(Integer nBytes, A attach) {
             if (nBytes.intValue() < 0) {
-                readPending = false;
-                handler.failed(new EOFException(), attach);
-                return;
-            }
-            try {
-                //the data read
-                int read = 0;
-                //the SSL engine result
-                SSLEngineResult unwrap;
-                do {
-                    //prepare the buffer
-                    netInBuffer.flip();
-                    //unwrap the data
-                    unwrap = sslEngine.unwrap(netInBuffer, dst);
-                    //compact the buffer
-                    netInBuffer.compact();
-                    if (unwrap.getStatus() == Status.OK || unwrap.getStatus() == Status.BUFFER_UNDERFLOW) {
-                        //we did receive some data, add it to our total
-                        read += unwrap.bytesProduced();
-                        //perform any tasks if needed
-                        if (unwrap.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
-                            tasks();
-                        //if we need more network data, then bail out for now.
-                        if (unwrap.getStatus() == Status.BUFFER_UNDERFLOW)
+                failed(new EOFException(), attach);
+            } else {
+                try {
+                    //the data read
+                    int read = 0;
+                    //the SSL engine result
+                    SSLEngineResult unwrap;
+                    do {
+                        //prepare the buffer
+                        netInBuffer.flip();
+                        //unwrap the data
+                        unwrap = sslEngine.unwrap(netInBuffer, dst);
+                        //compact the buffer
+                        netInBuffer.compact();
+                        if (unwrap.getStatus() == Status.OK || unwrap.getStatus() == Status.BUFFER_UNDERFLOW) {
+                            //we did receive some data, add it to our total
+                            read += unwrap.bytesProduced();
+                            //perform any tasks if needed
+                            if (unwrap.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
+                                tasks();
+                            //if we need more network data, then bail out for now.
+                            if (unwrap.getStatus() == Status.BUFFER_UNDERFLOW)
+                                break;
+                        } else if (unwrap.getStatus() == Status.BUFFER_OVERFLOW && read > 0) {
+                            //buffer overflow can happen, if we have read data, then
+                            //empty out the dst buffer before we do another read
                             break;
-                    } else if (unwrap.getStatus() == Status.BUFFER_OVERFLOW && read > 0) {
-                        //buffer overflow can happen, if we have read data, then
-                        //empty out the dst buffer before we do another read
-                        break;
-                    } else {
-                        //here we should trap BUFFER_OVERFLOW and call expand on the buffer
-                        //for now, throw an exception, as we initialized the buffers
-                        //in the constructor
-                        throw new IOException(sm.getString("channel.nio.ssl.unwrapFail", unwrap.getStatus()));
-                    }
-                } while ((netInBuffer.position() != 0)); //continue to unwrapping as long as the input buffer has stuff
-                // If everything is OK, so complete
-                readPending = false;
-                handler.completed(Integer.valueOf(read), attach);
-            } catch (Exception e) {
-                // The operation must fails
-                readPending = false;
-                handler.failed(e, attach);
+                        } else {
+                            //here we should trap BUFFER_OVERFLOW and call expand on the buffer
+                            //for now, throw an exception, as we initialized the buffers
+                            //in the constructor
+                            throw new IOException(sm.getString("channel.nio.ssl.unwrapFail", unwrap.getStatus()));
+                        }
+                    } while ((netInBuffer.position() != 0)); //continue to unwrapping as long as the input buffer has stuff
+                    // If everything is OK, so complete
+                    readPending = false;
+                    handler.completed(Integer.valueOf(read), attach);
+                } catch (Exception e) {
+                    failed(e, attach);
+                }
             }
         }
         @Override
@@ -782,7 +779,7 @@ public class SecureNio2Channel extends N
     public <A> void read(final ByteBuffer dst,
             long timeout, TimeUnit unit, final A attachment,
             final CompletionHandler<Integer, ? super A> handler) {
-        //are we in the middle of closing or closed?
+        // Check state
         if (closing || closed) {
             handler.completed(Integer.valueOf(-1), attachment);
             return;
@@ -792,9 +789,10 @@ public class SecureNio2Channel extends N
         } else {
             readPending = true;
         }
-        //did we finish our handshake?
-        if (!handshakeComplete)
+        if (!handshakeComplete) {
             throw new IllegalStateException(sm.getString("channel.nio.ssl.incompleteHandshake"));
+        }
+
         ReadCompletionHandler<A> readCompletionHandler = new ReadCompletionHandler<>(dst, handler);
         if (netInBuffer.position() > 0 ) {
             readCompletionHandler.completed(Integer.valueOf(netInBuffer.position()), attachment);
@@ -806,7 +804,7 @@ public class SecureNio2Channel extends N
     @Override
     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?
+        // Check state
         if (closing || closed) {
             handler.failed(new IOException(sm.getString("channel.nio.ssl.closing")), attachment);
             return;
@@ -825,39 +823,37 @@ public class SecureNio2Channel extends N
             final int written = result.bytesConsumed();
             netOutBuffer.flip();
             if (result.getStatus() == Status.OK) {
-                if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
+                if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
                     tasks();
-            } else {
-                writePending = false;
-                handler.failed(new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus())), attachment);
-                return;
-            }
-            // Write data to the channel
-            sc.write(this.netOutBuffer, timeout, unit, attachment,
-                    new CompletionHandler<Integer, A>() {
-                @Override
-                public void completed(Integer nBytes, A attach) {
-                    if (nBytes.intValue() < 0) {
-                        writePending = false;
-                        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
+                }
+                // Write data to the channel
+                sc.write(this.netOutBuffer, timeout, unit, attachment,
+                        new CompletionHandler<Integer, A>() {
+                    @Override
+                    public void completed(Integer nBytes, A attach) {
+                        if (nBytes.intValue() < 0) {
+                            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
+                            writePending = false;
+                            handler.completed(Integer.valueOf(written), attach);
+                        }
+                    }
+                    @Override
+                    public void failed(Throwable exc, A attach) {
                         writePending = false;
-                        handler.completed(Integer.valueOf(written), attach);
+                        handler.failed(exc, attach);
                     }
-                }
-                @Override
-                public void failed(Throwable exc, A attach) {
-                    writePending = false;
-                    handler.failed(exc, attach);
-                }
-            });
-        } catch (Throwable exp) {
+                });
+            } else {
+                throw new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus()));
+            }
+        } catch (Exception e) {
             writePending = false;
-            handler.failed(exp, attachment);
+            handler.failed(e, attachment);
         }
     }
 
@@ -893,36 +889,35 @@ public class SecureNio2Channel extends N
         @Override
         public void completed(Integer nBytes, GatherState<A> attachment) {
             if (nBytes.intValue() < 0) {
-                writePending = false;
-                state.handler.failed(new EOFException(), state.attachment);
+                failed(new EOFException(), attachment);
             } else {
                 if (state.pos == state.offset + state.length) {
                     writePending = false;
                     state.handler.completed(Long.valueOf(state.writeCount), state.attachment);
-                    return;
-                }
-                try {
-                    // Prepare the output buffer
-                    netOutBuffer.clear();
-                    // Wrap the source data into the internal buffer
-                    SSLEngineResult result = sslEngine.wrap(state.srcs[state.offset], netOutBuffer);
-                    int written = result.bytesConsumed();
-                    state.writeCount += written;
-                    netOutBuffer.flip();
-                    if (result.getStatus() == Status.OK) {
-                        if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
-                            tasks();
-                    } else {
-                        failed(new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus())), attachment);
-                        return;
-                    }
-                    if (written > 0) {
-                        state.offset++;
+                } else {
+                    try {
+                        // Prepare the output buffer
+                        netOutBuffer.clear();
+                        // Wrap the source data into the internal buffer
+                        SSLEngineResult result = sslEngine.wrap(state.srcs[state.offset], netOutBuffer);
+                        int written = result.bytesConsumed();
+                        state.writeCount += written;
+                        netOutBuffer.flip();
+                        if (result.getStatus() == Status.OK) {
+                            if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+                                tasks();
+                            }
+                            if (written > 0) {
+                                state.offset++;
+                            }
+                            // Write data to the channel
+                            sc.write(netOutBuffer, state.timeout, state.unit, state, this);
+                        } else {
+                            throw new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus()));
+                        }
+                    } catch (Exception e) {
+                        failed(e, attachment);
                     }
-                    // Write data to the channel
-                    sc.write(netOutBuffer, state.timeout, state.unit, state, this);
-                } catch (Throwable exp) {
-                    failed(exp, attachment);
                 }
             }
         }
@@ -937,10 +932,10 @@ public class SecureNio2Channel extends N
     public <A> void write(ByteBuffer[] srcs, int offset, int length,
             long timeout, TimeUnit unit, A attachment,
             CompletionHandler<Long, ? super A> handler) {
+        // Check state
         if ((offset < 0) || (length < 0) || (offset > srcs.length - length)) {
             throw new IndexOutOfBoundsException();
         }
-        //are we closing or closed?
         if (closing || closed) {
             handler.failed(new IOException(sm.getString("channel.nio.ssl.closing")), attachment);
             return;
@@ -960,18 +955,17 @@ public class SecureNio2Channel extends N
             state.writeCount += result.bytesConsumed();
             netOutBuffer.flip();
             if (result.getStatus() == Status.OK) {
-                if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
+                if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
                     tasks();
+                }
+                // Write data to the channel
+                sc.write(netOutBuffer, timeout, unit, state, new GatherCompletionHandler<>(state));
             } else {
-                writePending = false;
-                handler.failed(new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus())), attachment);
-                return;
+                throw new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus()));
             }
-            // Write data to the channel
-            sc.write(netOutBuffer, timeout, unit, state, new GatherCompletionHandler<>(state));
-        } catch (Throwable exp) {
+        } catch (Exception e) {
             writePending = false;
-            handler.failed(exp, attachment);
+            handler.failed(e, attachment);
         }
    }
 



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