Author: markt Date: Wed Mar 13 21:42:16 2013 New Revision: 1456154 URL: http://svn.apache.org/r1456154 Log: Initial fix for APR/native + SSL issues.
Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java?rev=1456154&r1=1456153&r2=1456154&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java Wed Mar 13 21:42:16 2013 @@ -17,6 +17,7 @@ package org.apache.coyote.http11.upgrade; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; @@ -27,16 +28,25 @@ import org.apache.tomcat.util.net.Socket public class AprServletOutputStream extends AbstractServletOutputStream { + private static final int SSL_OUTPUT_BUFFER_SIZE = 8192; + private final AprEndpoint endpoint; private final SocketWrapper<Long> wrapper; private final long socket; private volatile boolean closed = false; + private final ByteBuffer sslOutputBuffer; public AprServletOutputStream(SocketWrapper<Long> wrapper, AprEndpoint endpoint) { this.endpoint = endpoint; this.wrapper = wrapper; this.socket = wrapper.getSocket().longValue(); + if (endpoint.isSSLEnabled()) { + sslOutputBuffer = ByteBuffer.allocateDirect(SSL_OUTPUT_BUFFER_SIZE); + sslOutputBuffer.position(SSL_OUTPUT_BUFFER_SIZE); + } else { + sslOutputBuffer = null; + } } @@ -97,9 +107,30 @@ public class AprServletOutputStream exte int written; do { - written = Socket.send(socket, b, start, left); + if (endpoint.isSSLEnabled()) { + if (sslOutputBuffer.remaining() == 0) { + // Buffer was fully written last time around + sslOutputBuffer.clear(); + if (left < SSL_OUTPUT_BUFFER_SIZE) { + sslOutputBuffer.put(b, start, left); + } else { + sslOutputBuffer.put(b, start, SSL_OUTPUT_BUFFER_SIZE); + } + sslOutputBuffer.flip(); + } else { + // Buffer still has data from previous attempt to write + // APR + SSL requires that exactly the same parameters are + // passed when re-attempting the write + } + written = Socket.sendb(socket, sslOutputBuffer, start, left); + if (written > 0) { + sslOutputBuffer.position( + sslOutputBuffer.position() + written); + } + } else { + written = Socket.send(socket, b, start, left); + } if (Status.APR_STATUS_IS_EAGAIN(-written)) { - endpoint.getPoller().add(socket, -1, false, true); written = 0; } else if (written < 0) { throw new IOException(sm.getString("apr.write.error", --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org