Author: markt
Date: Mon Mar  9 16:32:43 2015
New Revision: 1665297

URL: http://svn.apache.org/r1665297
Log:
Follow up to r1665062
Callers assume that output() will fully write the data that is passed to it. 
Ensure that this is the case when the AJP message size is larger than the 
output buffer.

Modified:
    tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java

Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java?rev=1665297&r1=1665296&r2=1665297&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java Mon 
Mar  9 16:32:43 2015
@@ -302,24 +302,29 @@ public class AjpNioProcessor extends Abs
         ByteBuffer writeBuffer =
                 socketWrapper.getSocket().getBufHandler().getWriteBuffer();
 
-        int toWrite = Math.min(length, writeBuffer.remaining());
-        writeBuffer.put(src, offset, toWrite);
-        
-        writeBuffer.flip();
-
-        long writeTimeout = att.getWriteTimeout();
-        Selector selector = null;
-        try {
-            selector = pool.get();
-        } catch ( IOException x ) {
-            //ignore
-        }
-        try {
-            pool.write(writeBuffer, socketWrapper.getSocket(), selector,
-                    writeTimeout, true);
-        }finally { 
-            writeBuffer.clear();
-            if ( selector != null ) pool.put(selector);
+        int left = length;
+        int written = 0;
+        while (left > 0) {
+            int toWrite = Math.min(left, writeBuffer.remaining());
+            writeBuffer.put(src, offset, toWrite);
+            
+            writeBuffer.flip();
+    
+            long writeTimeout = att.getWriteTimeout();
+            Selector selector = null;
+            try {
+                selector = pool.get();
+            } catch ( IOException x ) {
+                //ignore
+            }
+            try {
+                written = pool.write(writeBuffer, socketWrapper.getSocket(),
+                        selector, writeTimeout, true);
+            } finally { 
+                writeBuffer.clear();
+                if ( selector != null ) pool.put(selector);
+            }
+            left -= written;
         }
     }
 



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

Reply via email to