Author: markt
Date: Fri Oct 23 13:10:07 2015
New Revision: 1710204
URL: http://svn.apache.org/viewvc?rev=1710204&view=rev
Log:
Use explicit rather than anonymous inner classes for the handshake completion
handlers since that makes it easier to read debug traces.
Minor formatting fixes
Add a (possibly temporary) workaround for Chrome+NIO2
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=1710204&r1=1710203&r2=1710204&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java Fri Oct
23 13:10:07 2015
@@ -81,36 +81,45 @@ public class SecureNio2Channel extends N
netInBuffer = ByteBuffer.allocate(DEFAULT_NET_BUFFER_SIZE);
netOutBuffer = ByteBuffer.allocate(DEFAULT_NET_BUFFER_SIZE);
}
- handshakeReadCompletionHandler = new CompletionHandler<Integer,
SocketWrapperBase<Nio2Channel>>() {
- @Override
- public void completed(Integer result,
SocketWrapperBase<Nio2Channel> attachment) {
- if (result.intValue() < 0) {
- failed(new EOFException(), attachment);
- } else {
- endpoint.processSocket(attachment, SocketStatus.OPEN_READ,
false);
- }
- }
- @Override
- public void failed(Throwable exc, SocketWrapperBase<Nio2Channel>
attachment) {
- endpoint.processSocket(attachment, SocketStatus.ERROR, false);
- }
- };
- handshakeWriteCompletionHandler = new CompletionHandler<Integer,
SocketWrapperBase<Nio2Channel>>() {
- @Override
- public void completed(Integer result,
SocketWrapperBase<Nio2Channel> attachment) {
- if (result.intValue() < 0) {
- failed(new EOFException(), attachment);
- } else {
- endpoint.processSocket(attachment,
SocketStatus.OPEN_WRITE, false);
- }
+ handshakeReadCompletionHandler = new HandshakeReadCompletionHandler();
+ handshakeWriteCompletionHandler = new
HandshakeWriteCompletionHandler();
+ }
+
+
+ private class HandshakeReadCompletionHandler
+ implements CompletionHandler<Integer,
SocketWrapperBase<Nio2Channel>> {
+ @Override
+ public void completed(Integer result, SocketWrapperBase<Nio2Channel>
attachment) {
+ if (result.intValue() < 0) {
+ failed(new EOFException(), attachment);
+ } else {
+ endpoint.processSocket(attachment, SocketStatus.OPEN_READ,
false);
}
- @Override
- public void failed(Throwable exc, SocketWrapperBase<Nio2Channel>
attachment) {
- endpoint.processSocket(attachment, SocketStatus.ERROR, false);
+ }
+ @Override
+ public void failed(Throwable exc, SocketWrapperBase<Nio2Channel>
attachment) {
+ endpoint.processSocket(attachment, SocketStatus.ERROR, false);
+ }
+ }
+
+
+ private class HandshakeWriteCompletionHandler
+ implements CompletionHandler<Integer,
SocketWrapperBase<Nio2Channel>> {
+ @Override
+ public void completed(Integer result, SocketWrapperBase<Nio2Channel>
attachment) {
+ if (result.intValue() < 0) {
+ failed(new EOFException(), attachment);
+ } else {
+ endpoint.processSocket(attachment, SocketStatus.OPEN_WRITE,
false);
}
- };
+ }
+ @Override
+ public void failed(Throwable exc, SocketWrapperBase<Nio2Channel>
attachment) {
+ endpoint.processSocket(attachment, SocketStatus.ERROR, false);
+ }
}
+
@Override
public void reset(AsynchronousSocketChannel channel,
SocketWrapperBase<Nio2Channel> socket)
throws IOException {
@@ -187,7 +196,8 @@ public class SecureNio2Channel extends N
* close and positive if the handshake is incomplete
*
* @throws IOException if an error occurs during the handshake
- */ @Override
+ */
+ @Override
public int handshake() throws IOException {
return handshakeInternal(true);
}
@@ -468,7 +478,6 @@ public class SecureNio2Channel extends N
* @throws IOException
*/
protected SSLEngineResult handshakeUnwrap() throws IOException {
-
if (netInBuffer.position() == netInBuffer.limit()) {
//clear the buffer if we have emptied it out on data
netInBuffer.clear();
@@ -814,7 +823,17 @@ public class SecureNio2Channel extends N
//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
+ // continue to unwrap as long as the input buffer has
stuff
+ // TODO: unwrap appears only to unwrap one TLS record
at
+ // a time even if there are multiple TLS records
+ // in the input buffer. Therefore multiple calls
+ // to unwrap are required to ensure that all TLS
+ // records are decrypted and written to dst.
+ // This may be a bug in tc-native or something
+ // that is better handled at that level. For now
+ // the '|| unwrap.getStatus() == Status.OK' is a
+ // workaround.
+ } while ((netInBuffer.position() != 0) ||
unwrap.getStatus() == Status.OK);
// If everything is OK, so complete
handler.completed(Integer.valueOf(read), attach);
} catch (Exception e) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]