/** * Flush the response. * * @throws IOException an underlying I/O error occurred * */ @Override public void flush() throws IOException { super.flush(); // Flush the current buffer flushBuffer(); }
@Override protected boolean prepareSendfile(OutputFilter[] outputFilters) { String fileName = (String) request.getAttribute("org.apache.tomcat.sendfile.filename"); if (fileName != null) { // No entity body sent here outputBuffer.addActiveFilter(outputFilters[Constants.VOID_FILTER]); contentDelimitation = true; sendfileData = new NioEndpoint.SendfileData(); sendfileData.fileName = fileName; sendfileData.pos = ((Long) request.getAttribute("org.apache.tomcat.sendfile.start")).longValue(); sendfileData.length = ((Long) request.getAttribute("org.apache.tomcat.sendfile.end")).longValue() - sendfileData.pos; return true; } return false; }
/** * Commit the response. * * @throws IOException an undelying I/O error occured */ protected void commit() throws IOException { // The response is now committed committed = true; response.setCommitted(true); if (pos > 0) { // Sending the response header buffer addToBB(buf, 0, pos); } }
private synchronized void addToBB(byte[] buf, int offset, int length) throws IOException { if (length == 0) return; // Try to flush any data in the socket's write buffer first boolean dataLeft = flushBuffer(isBlocking()); // Keep writing until all the data is written or a non-blocking write // leaves data in the buffer while (!dataLeft && length > 0) { int thisTime = transfer(buf,offset,length,socket.getBufHandler().getWriteBuffer()); length = length - thisTime; offset = offset + thisTime; int written = writeToSocket(socket.getBufHandler().getWriteBuffer(), isBlocking(), true); if (written == 0) { dataLeft = true; } else { dataLeft = flushBuffer(isBlocking()); } } NioEndpoint.KeyAttachment ka = (NioEndpoint.KeyAttachment)socket.getAttachment(false); if (ka != null) ka.access();//prevent timeouts for just doing client writes if (!isBlocking() && length > 0) { // Remaining data must be buffered addToBuffers(buf, offset, length); } }
OutputFilter[] outputFilters = outputBuffer.getFilters(); outputBuffer.addActiveFilter (outputFilters[Constants.IDENTITY_FILTER]); return; outputBuffer.addActiveFilter (outputFilters[Constants.VOID_FILTER]); entityBody = false; outputBuffer.addActiveFilter (outputFilters[Constants.VOID_FILTER]); contentDelimitation = true; outputBuffer.addActiveFilter(outputFilters[Constants.VOID_FILTER]); contentDelimitation = true; sendfileData = new NioEndpoint.SendfileData(); if (contentLength != -1) { headers.setValue("Content-Length").setLong(contentLength); outputBuffer.addActiveFilter (outputFilters[Constants.IDENTITY_FILTER]); contentDelimitation = true; } else { if (entityBody && http11) { outputBuffer.addActiveFilter (outputFilters[Constants.CHUNKED_FILTER]); contentDelimitation = true; headers.addValue(Constants.TRANSFERENCODING).setString(Constants.CHUNKED);
/** * Send an acknowledgment. */ @Override public void sendAck() throws IOException { if (!committed) { //Socket.send(socket, Constants.ACK_BYTES, 0, Constants.ACK_BYTES.length) < 0 socket.getBufHandler() .getWriteBuffer().put(Constants.ACK_BYTES,0,Constants.ACK_BYTES.length); writeToSocket(socket.getBufHandler() .getWriteBuffer(),true,true); } }
public Http11NioProcessor(int maxHttpHeaderSize, NioEndpoint endpoint, int maxTrailerSize, int maxExtensionSize) { super(endpoint); inputBuffer = new InternalNioInputBuffer(request, maxHttpHeaderSize); request.setInputBuffer(inputBuffer); outputBuffer = new InternalNioOutputBuffer(response, maxHttpHeaderSize); response.setOutputBuffer(outputBuffer); initializeFilters(maxTrailerSize, maxExtensionSize); }
outputBuffer.setSocket(socket); inputBuffer.setSelectorPool(endpoint.getSelectorPool()); outputBuffer.setSelectorPool(endpoint.getSelectorPool()); outputBuffer.nextRequest();
outputBuffer.commit(); } catch (IOException e) { outputBuffer.sendAck(); } catch (IOException e) { outputBuffer.flush(); } catch (IOException e) { outputBuffer.endRequest(); } catch (IOException e) { outputBuffer.reset();
outputBuffer.nextRequest(); recycle(); return SocketState.CLOSED; endRequest(); boolean pipelined = inputBuffer.nextRequest(); outputBuffer.nextRequest(); recycle(); return (pipelined || !keepAlive) ? SocketState.CLOSED : SocketState.OPEN;
boolean dataLeft = hasMoreDataToFlush(); writeToSocket(socket.getBufHandler().getWriteBuffer(),block, !flipped); dataLeft = hasMoreDataToFlush(); while (!hasMoreDataToFlush() && bufIter.hasNext()) { ByteBufferHolder buffer = bufIter.next(); buffer.flip(); while (!hasMoreDataToFlush() && buffer.getBuf().remaining()>0) { transfer(buffer.getBuf(), socket.getBufHandler().getWriteBuffer()); if (buffer.getBuf().remaining() == 0) { bufIter.remove(); writeToSocket(socket.getBufHandler().getWriteBuffer(),block, true); return hasMoreDataToFlush();
/** * End the processing of the current request, and stop any further * transactions with the client */ private void close() { event = false; try { outputBuffer.endRequest(); } catch (IOException e) { // Set error flag error = true; } }
/** * Add input or output filter. * * @param className * class name of the filter */ protected void addFilter(String className) { try { Class<?> clazz = Class.forName(className); Object obj = clazz.newInstance(); if (obj instanceof InputFilter) { inputBuffer.addFilter((InputFilter) obj); } else if (obj instanceof OutputFilter) { outputBuffer.addFilter((OutputFilter) obj); } else { CoyoteLogger.HTTP_LOGGER.unknownFilter(className); } } catch (Exception e) { CoyoteLogger.HTTP_LOGGER.errorInitializingFilter(className, e); } }
/** * Commit the action * * @param param */ private void commit(Object param) { if (!response.isCommitted()) { // Validate and write response headers prepareResponse(); try { outputBuffer.commit(); } catch (IOException e) { // Set error flag error = true; } } }
OutputFilter[] outputFilters = outputBuffer.getFilters(); outputBuffer.addActiveFilter(outputFilters[Constants.IDENTITY_FILTER]); return; outputBuffer.addActiveFilter(outputFilters[Constants.VOID_FILTER]); entityBody = false; contentDelimitation = true; outputBuffer.addActiveFilter(outputFilters[Constants.VOID_FILTER]); contentDelimitation = true; outputBuffer.addActiveFilter(outputFilters[Constants.VOID_FILTER]); contentDelimitation = true; sendfileData = endpoint.getSendfileData(); outputBuffer.addActiveFilter(outputFilters[Constants.IDENTITY_FILTER]); contentDelimitation = true; } else { if (entityBody && http11 && (keepAlive || CHUNK_ON_CLOSE)) { outputBuffer.addActiveFilter(outputFilters[Constants.CHUNKED_FILTER]); contentDelimitation = true; headers.addValue(Constants.TRANSFERENCODING).setString(Constants.CHUNKED); } else { outputBuffer.addActiveFilter(outputFilters[Constants.IDENTITY_FILTER]); outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]); headers.setValue("Content-Encoding").setString("gzip");
/** * Send an acknowledgment. */ @Override public void sendAck() throws IOException { if (!committed) { //Socket.send(socket, Constants.ACK_BYTES, 0, Constants.ACK_BYTES.length) < 0 socket.getBufHandler() .getWriteBuffer().put(Constants.ACK_BYTES,0,Constants.ACK_BYTES.length); writeToSocket(socket.getBufHandler() .getWriteBuffer(),true,true); } }
public Http11NioProcessor(int maxHttpHeaderSize, NioEndpoint endpoint, int maxTrailerSize) { super(endpoint); inputBuffer = new InternalNioInputBuffer(request, maxHttpHeaderSize); request.setInputBuffer(inputBuffer); outputBuffer = new InternalNioOutputBuffer(response, maxHttpHeaderSize); response.setOutputBuffer(outputBuffer); initializeFilters(maxTrailerSize); }
outputBuffer.setSocket(socket); inputBuffer.setSelectorPool(endpoint.getSelectorPool()); outputBuffer.setSelectorPool(endpoint.getSelectorPool()); outputBuffer.nextRequest();
if (keepAlive) { inputBuffer.nextRequest(); outputBuffer.nextRequest(); return SocketState.OPEN; } else {
public void endRequest() { // Finish the handling of the request try { inputBuffer.endRequest(); } catch (IOException e) { error = true; } catch (Throwable t) { CoyoteLogger.HTTP_LOGGER.errorFinishingRequest(t); // 500 - Internal Server Error response.setStatus(500); error = true; } try { outputBuffer.endRequest(); } catch (IOException e) { error = true; } catch (Throwable t) { CoyoteLogger.HTTP_LOGGER.errorFinishingResponse(t); error = true; } }