Fields Summary |
---|
protected static final com.sun.org.apache.commons.logging.Log | logLogger. |
protected static final org.apache.tomcat.util.res.StringManager | smThe string manager for this package. |
protected org.apache.coyote.Response | responseAssociated Coyote response. |
protected org.apache.tomcat.util.http.MimeHeaders | headersHeaders of the associated request. |
protected boolean | committedCommitted flag. |
protected boolean | finishedFinished flag. |
protected byte[] | bufPointer to the current read buffer. |
protected int | posPosition in the buffer. |
protected OutputStream | outputStreamUnderlying output stream. |
protected org.apache.coyote.OutputBuffer | outputStreamOutputBufferUnderlying output buffer. |
protected OutputFilter[] | filterLibraryFilter library.
Note: Filter[0] is always the "chunked" filter. |
protected OutputFilter[] | activeFiltersActive filter (which is actually the top of the pipeline). |
protected int | lastActiveFilterIndex of the last active filter. |
protected org.apache.tomcat.util.buf.ByteChunk | socketBufferSocket buffer. |
protected boolean | useSocketBufferSocket buffer (extra buffering to reduce number of packets sent). |
Methods Summary |
---|
public void | addActiveFilter(OutputFilter filter)Add an output filter to the filter library.
if (lastActiveFilter == -1) {
filter.setBuffer(outputStreamOutputBuffer);
} else {
for (int i = 0; i <= lastActiveFilter; i++) {
if (activeFilters[i] == filter)
return;
}
filter.setBuffer(activeFilters[lastActiveFilter]);
}
activeFilters[++lastActiveFilter] = filter;
filter.setResponse(response);
|
public void | addFilter(OutputFilter filter)Add an output filter to the filter library.
OutputFilter[] newFilterLibrary =
new OutputFilter[filterLibrary.length + 1];
for (int i = 0; i < filterLibrary.length; i++) {
newFilterLibrary[i] = filterLibrary[i];
}
newFilterLibrary[filterLibrary.length] = filter;
filterLibrary = newFilterLibrary;
activeFilters = new OutputFilter[filterLibrary.length];
|
public void | clearFilters()Clear filters.
filterLibrary = new OutputFilter[0];
lastActiveFilter = -1;
|
public void | commit()Commit the response.
// The response is now committed
committed = true;
response.setCommitted(true);
/* GlassFish Issue 646
if (pos > 0) {
// Sending the response header buffer
if (useSocketBuffer) {
socketBuffer.append(buf, 0, pos);
} else {
outputStream.write(buf, 0, pos);
}
flush(false);
}*/
// START GlassFish Issue 646
if (pos > 0) {
flush(false);
}
// END GlassFish Issue 646
|
public int | doWrite(org.apache.tomcat.util.buf.ByteChunk chunk, org.apache.coyote.Response res)Write the contents of a byte chunk.
if (!committed) {
// Send the connector a request for commit. The connector should
// then validate the headers, send them (using sendHeaders) and
// set the filters accordingly.
response.action(ActionCode.ACTION_COMMIT, null);
}
if (lastActiveFilter == -1)
return outputStreamOutputBuffer.doWrite(chunk, res);
else
return activeFilters[lastActiveFilter].doWrite(chunk, res);
|
public void | endHeaders()End the header block.
write(Constants.CRLF_BYTES);
|
public void | endRequest()End request.
if (!committed) {
// Send the connector a request for commit. The connector should
// then validate the headers, send them (using sendHeader) and
// set the filters accordingly.
response.action(ActionCode.ACTION_COMMIT, null);
}
if (finished)
return;
if (lastActiveFilter != -1)
activeFilters[lastActiveFilter].end();
if (useSocketBuffer) {
socketBuffer.flushBuffer();
}
finished = true;
|
public void | flush()Flush the response.
if (!committed) {
// Send the connector a request for commit. The connector should
// then validate the headers, send them (using sendHeader) and
// set the filters accordingly.
response.action(ActionCode.ACTION_COMMIT, null);
}
// Flush the current buffer
if (useSocketBuffer) {
socketBuffer.flushBuffer();
}
|
private void | flush(boolean isFull)Flush the buffer.
// Sending the response header buffer
realWriteBytes(buf, 0, pos);
if ( isFull ) {
pos = 0;
}
|
public OutputFilter[] | getFilters()Get filters.
return filterLibrary;
|
private java.lang.String | getMessage(int message)
if (System.getSecurityManager() != null){
return (String)AccessController.doPrivileged(
new PrivilegedAction(){
public Object run(){
return HttpMessages.getMessage(message);
}
}
);
} else {
return HttpMessages.getMessage(message);
}
|
public java.io.OutputStream | getOutputStream()Get the underlying socket output stream.
return outputStream;
|
public void | nextRequest()End processing of current HTTP request.
Note: All bytes of the current request should have been already
consumed. This method only resets all the pointers so that we are ready
to parse the next HTTP request.
// Recycle Request object
response.recycle();
socketBuffer.recycle();
// Recycle filters
for (int i = 0; i <= lastActiveFilter; i++) {
activeFilters[i].recycle();
}
// Reset pointers
pos = 0;
lastActiveFilter = -1;
committed = false;
finished = false;
|
public void | realWriteBytes(byte[] cbuf, int off, int len)Callback to write data from the buffer.
if (len > 0) {
if (useSocketBuffer) {
socketBuffer.append(cbuf, off, len);
} else {
outputStream.write(cbuf, off, len);
}
}
|
public void | recycle()Recycle the output buffer. This should be called when closing the
connection.
// Recycle Request object
response.recycle();
socketBuffer.recycle();
outputStream = null;
pos = 0;
lastActiveFilter = -1;
committed = false;
finished = false;
|
public void | reset()Reset current response.
if (committed)
throw new IllegalStateException(/*FIXME:Put an error message*/);
// Recycle Request object
response.recycle();
|
public void | sendAck()Send an acknoledgement.
if (!committed){
realWriteBytes(Constants.ACK_BYTES,0,
Constants.ACK_BYTES.length);
}
|
public void | sendHeader(org.apache.tomcat.util.buf.MessageBytes name, org.apache.tomcat.util.buf.MessageBytes value)Send a header.
write(name);
write(": ");
write(value);
write(Constants.CRLF_BYTES);
|
public void | sendHeader(org.apache.tomcat.util.buf.ByteChunk name, org.apache.tomcat.util.buf.ByteChunk value)Send a header.
write(name);
write(": ");
write(value);
write(Constants.CRLF_BYTES);
|
public void | sendHeader(java.lang.String name, java.lang.String value)Send a header.
write(name);
write(": ");
write(value);
write(Constants.CRLF_BYTES);
|
public void | sendStatus()Send the response status line.
// Write protocol name
write("HTTP/1.1 ");
// Write status code
int status = response.getStatus();
switch (status) {
case 200:
write("200");
break;
case 400:
write("400");
break;
case 404:
write("404");
break;
default:
write(status);
}
write(" ");
// Write message
String message = response.getMessage();
if (message == null) {
write(getMessage(status));
} else {
write(message);
}
// End the response status line
if ( System.getSecurityManager() != null ){
AccessController.doPrivileged(
new PrivilegedAction(){
public Object run(){
write(Constants.CRLF_BYTES);
return null;
}
}
);
} else {
write(Constants.CRLF_BYTES);
}
|
public void | setOutputStream(java.io.OutputStream outputStream)Set the underlying socket output stream.
// ------------------------------------------------------------- Properties
// FIXME: Check for null ?
this.outputStream = outputStream;
|
public void | setSocketBuffer(int socketBufferSize)Set the socket buffer size.
if (socketBufferSize > 500) {
useSocketBuffer = true;
socketBuffer.allocate(socketBufferSize, socketBufferSize);
} else {
useSocketBuffer = false;
}
|
protected void | write(org.apache.tomcat.util.buf.MessageBytes mb)This method will write the contents of the specyfied message bytes
buffer to the output stream, without filtering. This method is meant to
be used to write the response header.
if (mb.getType() == MessageBytes.T_BYTES) {
ByteChunk bc = mb.getByteChunk();
write(bc);
} else if (mb.getType() == MessageBytes.T_CHARS) {
CharChunk cc = mb.getCharChunk();
write(cc);
} else {
write(mb.toString());
}
|
protected void | write(org.apache.tomcat.util.buf.ByteChunk bc)This method will write the contents of the specyfied message bytes
buffer to the output stream, without filtering. This method is meant to
be used to write the response header.
try{
realWriteBytes(bc.getBytes(),bc.getStart(),bc.getLength());
} catch (IOException ex){
;
}
|
protected void | write(org.apache.tomcat.util.buf.CharChunk cc)This method will write the contents of the specyfied char
buffer to the output stream, without filtering. This method is meant to
be used to write the response header.
int start = cc.getStart();
int end = cc.getEnd();
char[] cbuf = cc.getBuffer();
for (int i = start; i < end; i++) {
char c = cbuf[i];
if (c != 9) {
if ((c >= 0) && (c <= 31)) {
c = ' ";
}
if (c == 127) {
c = ' ";
}
}
// issue #3157, if buffer is full - flush it
if (pos >= buf.length) {
try {
flush(true);
} catch(IOException e) {
;
}
}
buf[pos++] = (byte) c;
}
try{
flush(true);
} catch (IOException ex){
;
}
|
protected void | write(byte[] b)This method will write the contents of the specyfied byte
buffer to the output stream, without filtering. This method is meant to
be used to write the response header.
try{
realWriteBytes(b, 0, b.length);
} catch (IOException ex){
;
}
|
protected void | write(java.lang.String s)This method will write the contents of the specyfied String to the
output stream, without filtering. This method is meant to be used to
write the response header.
if (s == null)
return;
// From the Tomcat 3.3 HTTP/1.0 connector
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt (i);
if (c != 9) {
if ((c >= 0) && (c <= 31)) {
c = ' ";
}
if (c == 127) {
c = ' ";
}
}
// issue #3157, if buffer is full - flush it
if (pos >= buf.length) {
try {
flush(true);
} catch(IOException e) {
;
}
}
buf[pos++] = (byte) c;
}
try{
flush(true);
} catch (IOException ex){
;
}
|
protected void | write(int i)This method will print the specified integer to the output stream,
without filtering. This method is meant to be used to write the
response header.
write(String.valueOf(i));
|