import org.apache.tomcat.util.buf.CharChunk;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.http.HttpMessages;
+import org.apache.tomcat.util.net.AbstractEndpoint;
+import org.apache.tomcat.util.net.SocketWrapper;
import org.apache.tomcat.util.res.StringManager;
-public abstract class AbstractOutputBuffer implements OutputBuffer{
+public abstract class AbstractOutputBuffer<S> implements OutputBuffer{
// ----------------------------------------------------- Instance Variables
activeFilters[lastActiveFilter].end();
finished = true;
}
+
+ public abstract void init(SocketWrapper<S> socketWrapper,
+ AbstractEndpoint endpoint) throws IOException;
+
public abstract void sendAck() throws IOException;
protected abstract void commit() throws IOException;
// Setting up the socket
this.socket = socketWrapper;
inputBuffer.init(socketWrapper, endpoint);
- long socketRef = socketWrapper.getSocket().longValue();
- outputBuffer.setSocket(socketRef);
+ outputBuffer.init(socketWrapper, endpoint);
// Error flag
error = false;
boolean openSocket = false;
boolean sendfileInProgress = false;
+ long socketRef = socketWrapper.getSocket().longValue();
+
while (!error && keepAlive && !comet && !isAsync() && !endpoint.isPaused()) {
// Parsing the request header
}
@Override
- protected AbstractOutputBuffer getOutputBuffer() {
+ protected AbstractOutputBuffer<Long> getOutputBuffer() {
return outputBuffer;
}
}
// Setting up the socket
this.socket = socketWrapper;
inputBuffer.init(socketWrapper, endpoint);
- outputBuffer.setSocket(this.socket.getSocket());
- outputBuffer.setSelectorPool(((NioEndpoint)endpoint).getSelectorPool());
+ outputBuffer.init(socketWrapper, endpoint);
// Error flag
error = false;
}
@Override
- protected AbstractOutputBuffer getOutputBuffer() {
+ protected AbstractOutputBuffer<NioChannel> getOutputBuffer() {
return outputBuffer;
}
// Setting up the I/O
this.socket = socketWrapper;
inputBuffer.init(socketWrapper, endpoint);
- outputBuffer.setOutputStream(socket.getSocket().getOutputStream());
+ outputBuffer.init(socketWrapper, endpoint);
// Error flag
error = false;
}
@Override
- protected AbstractOutputBuffer getOutputBuffer() {
+ protected AbstractOutputBuffer<Socket> getOutputBuffer() {
return outputBuffer;
}
import org.apache.tomcat.jni.Socket;
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.http.HttpMessages;
+import org.apache.tomcat.util.net.AbstractEndpoint;
+import org.apache.tomcat.util.net.SocketWrapper;
/**
* Output buffer.
*
* @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
*/
-public class InternalAprOutputBuffer extends AbstractOutputBuffer {
+public class InternalAprOutputBuffer extends AbstractOutputBuffer<Long> {
// ----------------------------------------------------------- Constructors
/**
* Underlying socket.
*/
- protected long socket;
+ private long socket;
/**
* Direct byte buffer used for writing.
*/
- protected ByteBuffer bbuf = null;
+ private ByteBuffer bbuf = null;
- // ------------------------------------------------------------- Properties
+ // --------------------------------------------------------- Public Methods
+ @Override
+ public void init(SocketWrapper<Long> socketWrapper,
+ AbstractEndpoint endpoint) throws IOException {
- /**
- * Set the underlying socket.
- */
- public void setSocket(long socket) {
- this.socket = socket;
+ socket = socketWrapper.getSocket().longValue();
Socket.setsbb(this.socket, bbuf);
}
- // --------------------------------------------------------- Public Methods
-
-
/**
* Flush the response.
*
}
-
/**
* Callback to write data from the buffer.
*/
- protected void flushBuffer()
+ private void flushBuffer()
throws IOException {
if (bbuf.position() > 0) {
if (Socket.sendbb(socket, 0, bbuf.position()) < 0) {
return byteCount;
}
}
-
-
}
import org.apache.tomcat.util.MutableInteger;
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.http.HttpMessages;
+import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.NioChannel;
import org.apache.tomcat.util.net.NioEndpoint;
import org.apache.tomcat.util.net.NioSelectorPool;
+import org.apache.tomcat.util.net.SocketWrapper;
/**
* Output buffer.
* @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
* @author Filip Hanik
*/
-public class InternalNioOutputBuffer extends AbstractOutputBuffer {
+public class InternalNioOutputBuffer extends AbstractOutputBuffer<NioChannel> {
// ----------------------------------------------------------- Constructors
/**
* Number of bytes last written
*/
- protected MutableInteger lastWrite = new MutableInteger(1);
+ private MutableInteger lastWrite = new MutableInteger(1);
/**
* Underlying socket.
*/
- protected NioChannel socket;
+ private NioChannel socket;
/**
* Selector pool, for blocking reads and blocking writes
*/
- protected NioSelectorPool pool;
+ private NioSelectorPool pool;
- // ------------------------------------------------------------- Properties
-
-
- /**
- * Set the underlying socket.
- */
- public void setSocket(NioChannel socket) {
- this.socket = socket;
- }
-
- public void setSelectorPool(NioSelectorPool pool) {
- this.pool = pool;
- }
-
- public NioSelectorPool getSelectorPool() {
- return pool;
- }
-
// --------------------------------------------------------- Public Methods
long writeTimeout = att.getTimeout();
Selector selector = null;
try {
- selector = getSelectorPool().get();
+ selector = pool.get();
} catch ( IOException x ) {
//ignore
}
try {
- written = getSelectorPool().write(bytebuffer, socket, selector, writeTimeout, block,lastWrite);
+ written = pool.write(bytebuffer, socket, selector, writeTimeout, block,lastWrite);
//make sure we are flushed
do {
if (socket.flush(true,selector,writeTimeout,lastWrite)) break;
}while ( true );
}finally {
- if ( selector != null ) getSelectorPool().put(selector);
+ if ( selector != null ) pool.put(selector);
}
if ( block ) bytebuffer.clear(); //only clear
this.total = 0;
// ------------------------------------------------------ Protected Methods
+ @Override
+ public void init(SocketWrapper<NioChannel> socketWrapper,
+ AbstractEndpoint endpoint) throws IOException {
+
+ socket = socketWrapper.getSocket();
+ pool = ((NioEndpoint)endpoint).getSelectorPool();
+ }
+
/**
* Commit the response.
}
- int total = 0;
+ private int total = 0;
private synchronized void addToBB(byte[] buf, int offset, int length) throws IOException {
while (length > 0) {
int thisTime = length;
/**
* Callback to write data from the buffer.
*/
- protected void flushBuffer()
- throws IOException {
+ private void flushBuffer() throws IOException {
//prevent timeout for async,
SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector());
return byteCount;
}
}
-
-
}
import java.io.IOException;
import java.io.OutputStream;
+import java.net.Socket;
import org.apache.coyote.OutputBuffer;
import org.apache.coyote.Response;
import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.net.AbstractEndpoint;
+import org.apache.tomcat.util.net.SocketWrapper;
/**
* Output buffer.
*
* @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
*/
-public class InternalOutputBuffer extends AbstractOutputBuffer
+public class InternalOutputBuffer extends AbstractOutputBuffer<Socket>
implements ByteChunk.ByteOutputChannel {
// ----------------------------------------------------------- Constructors
}
/**
- * Underlying output stream.
+ * Underlying output stream. Note: protected to assist with unit testing
*/
protected OutputStream outputStream;
/**
* Socket buffer.
*/
- protected ByteChunk socketBuffer;
+ private ByteChunk socketBuffer;
/**
* Socket buffer (extra buffering to reduce number of packets sent).
*/
- protected boolean useSocketBuffer = false;
+ private boolean useSocketBuffer = false;
/**
- * Set the underlying socket output stream.
- */
- public void setOutputStream(OutputStream outputStream) {
-
- // FIXME: Check for null ?
-
- this.outputStream = outputStream;
-
- }
-
-
- /**
* Set the socket buffer size.
*/
public void setSocketBuffer(int socketBufferSize) {
// --------------------------------------------------------- Public Methods
+ @Override
+ public void init(SocketWrapper<Socket> socketWrapper,
+ AbstractEndpoint endpoint) throws IOException {
+
+ outputStream = socketWrapper.getSocket().getOutputStream();
+ }
+
/**
* Flush the response.
return byteCount;
}
}
-
-
}
Response res = new Response();
InternalOutputBuffer iob = new InternalOutputBuffer(res, 8 * 1024);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
- iob.setOutputStream(bos);
+ iob.outputStream = bos;
res.setOutputBuffer(iob);
// set up GzipOutputFilter to attach to the InternalOutputBuffer