package org.jboss.pitbull.internal.nio.http; import org.jboss.pitbull.Connection; import org.jboss.pitbull.StatusCode; import org.jboss.pitbull.internal.logging.Logger; import org.jboss.pitbull.internal.nio.socket.ManagedChannel; import org.jboss.pitbull.server.handlers.stream.StreamRequestHandler; import java.nio.ByteBuffer; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class StreamExecutor implements Runnable { protected ManagedChannel channel; protected StreamRequestHandler handler; protected ByteBuffer buffer; protected HttpRequestHeader requestHeader; protected Connection connection; protected static final Logger log = Logger.getLogger(StreamExecutor.class); public StreamExecutor(Connection connection, ManagedChannel channel, StreamRequestHandler handler, ByteBuffer buffer, HttpRequestHeader requestHeader) { this.connection = connection; this.channel = channel; this.handler = handler; this.buffer = buffer; this.requestHeader = requestHeader; } @Override public void run() { //long start = System.currentTimeMillis(); //log.debug("Start Stream Executor"); ContentInputStream is = ContentInputStream.create(channel, buffer, requestHeader.getHeaders()); NioStreamedResponse writer = new NioStreamedResponse(channel, requestHeader, is); // todo handle keepalive setting try { handler.execute(connection, requestHeader, is, writer); if (writer.isDetached() == false) { writer.end(); } } catch (Throwable ex) { log.error("Failed to execute", ex); if (!writer.isEnded() && !writer.isCommitted()) { try { writer.reset(); writer.setStatus(StatusCode.INTERNAL_SERVER_ERROR); writer.end(); } catch (Exception e) { try { channel.close(); } catch (Throwable t) {} } } else { try { channel.close(); } catch (Throwable t) {} } } //log.debug("End Stream Executor: " + (System.currentTimeMillis() - start)); } }