Author: violetagg Date: Mon Aug 29 13:40:51 2016 New Revision: 1758223 URL: http://svn.apache.org/viewvc?rev=1758223&view=rev Log: Introduce a new method ByteChunk.append(ByteBuffer)
Modified: tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java tomcat/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java Modified: tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java?rev=1758223&r1=1758222&r2=1758223&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java Mon Aug 29 13:40:51 2016 @@ -18,6 +18,7 @@ package org.apache.catalina.connector; import java.io.IOException; import java.io.Writer; +import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.security.AccessController; import java.security.PrivilegedActionException; @@ -384,6 +385,20 @@ public class OutputBuffer extends Writer } + /** + * Sends the buffer data to the client output, checking the + * state of Response and calling the right interceptors. + * + * @param buf the ByteBuffer to be written to the response + * + * @throws IOException An underlying IOException occurred + */ + @Override + public void realWriteBytes(ByteBuffer buf) throws IOException { + // To be implemented + } + + public void write(byte b[], int off, int len) throws IOException { if (suspended) { Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java?rev=1758223&r1=1758222&r2=1758223&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java Mon Aug 29 13:40:51 2016 @@ -98,6 +98,15 @@ public final class ByteChunk implements */ public void realWriteBytes(byte cbuf[], int off, int len) throws IOException; + + /** + * Send the bytes ( usually the internal conversion buffer ). + * Expect 8k output if the buffer is full. + * + * @param from bytes that will be written + * @throws IOException If an I/O occurs while writing the bytes + */ + public void realWriteBytes(ByteBuffer from) throws IOException; } // -------------------- @@ -357,6 +366,74 @@ public final class ByteChunk implements } + /** + * Add data to the buffer. + * + * @param from the ByteBuffer with the data + * @throws IOException Writing overflow data to the output channel failed + */ + public void append(ByteBuffer from) throws IOException { + int len = from.remaining(); + + // will grow, up to limit + makeSpace(len); + + // if we don't have limit: makeSpace can grow as it wants + if (limit < 0) { + // assert: makeSpace made enough space + from.get(buff, end, len); + end += len; + return; + } + + // Optimize on a common case. + // If the buffer is empty and the source is going to fill up all the + // space in buffer, may as well write it directly to the output, + // and avoid an extra copy + if (len == limit && end == start && out != null) { + out.realWriteBytes(from); + from.position(from.limit()); + return; + } + // if we have limit and we're below + if (len <= limit - end) { + // makeSpace will grow the buffer to the limit, + // so we have space + from.get(buff, end, len); + end += len; + return; + } + + // need more space than we can afford, need to flush + // buffer + + // the buffer is already at ( or bigger than ) limit + + // We chunk the data into slices fitting in the buffer limit, although + // if the data is written directly if it doesn't fit + + int avail = limit - end; + from.get(buff, end, avail); + end += avail; + + flushBuffer(); + + int fromLimit = from.limit(); + int remain = len - avail; + avail = limit - end; + while (remain >= avail) { + from.limit(from.position() + avail); + out.realWriteBytes(from); + from.position(from.limit()); + remain = remain - avail; + } + + from.limit(fromLimit); + from.get(buff, end, remain); + end += remain; + } + + // -------------------- Removing data from the buffer -------------------- public int substract() throws IOException { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org