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: [email protected]
For additional commands, e-mail: [email protected]