Class HttpChannel

  • All Implemented Interfaces:
    java.lang.Runnable, HttpOutput.Interceptor
    Direct Known Subclasses:
    HttpChannelOverFCGI, HttpChannelOverHttp, HttpChannelOverHTTP2

    public class HttpChannel
    extends java.lang.Object
    implements java.lang.Runnable, HttpOutput.Interceptor
    HttpChannel represents a single endpoint for HTTP semantic processing. The HttpChannel is both a HttpParser.RequestHandler, where it passively receives events from an incoming HTTP request, and a Runnable, where it actively takes control of the request/response life cycle and calls the application (perhaps suspending and resuming with multiple calls to run). The HttpChannel signals the switch from passive mode to active mode by returning true to one of the HttpParser.RequestHandler callbacks. The completion of the active phase is signalled by a call to HttpTransport.completed().
    • Method Detail

      • newHttpOutput

        protected HttpOutput newHttpOutput()
      • getBytesWritten

        public long getBytesWritten()
      • getRequests

        public long getRequests()
        Returns:
        the number of requests handled by this connection
      • getConnector

        public Connector getConnector()
      • getRequestLog

        public RequestLog getRequestLog()
      • setRequestLog

        public void setRequestLog​(RequestLog requestLog)
      • addRequestLog

        public void addRequestLog​(RequestLog requestLog)
      • getIdleTimeout

        public long getIdleTimeout()
        Get the idle timeout.

        This is implemented as a call to EndPoint.getIdleTimeout(), but may be overridden by channels that have timeouts different from their connections.

        Returns:
        the idle timeout (in milliseconds)
      • setIdleTimeout

        public void setIdleTimeout​(long timeoutMs)
        Set the idle timeout.

        This is implemented as a call to EndPoint.setIdleTimeout(long), but may be overridden by channels that have timeouts different from their connections.

        Parameters:
        timeoutMs - the idle timeout in milliseconds
      • getServer

        public Server getServer()
      • getRequest

        public Request getRequest()
      • getResponse

        public Response getResponse()
      • getConnection

        public Connection getConnection()
      • getEndPoint

        public EndPoint getEndPoint()
      • getLocalAddress

        public java.net.InetSocketAddress getLocalAddress()
      • getRemoteAddress

        public java.net.InetSocketAddress getRemoteAddress()
      • continue100

        public void continue100​(int available)
                         throws java.io.IOException
        If the associated response has the Expect header set to 100 Continue, then accessing the input stream indicates that the handler/servlet is ready for the request body and thus a 100 Continue response is sent.
        Parameters:
        available - estimate of the number of bytes that are available
        Throws:
        java.io.IOException - if the InputStream cannot be created
      • recycle

        public void recycle()
      • onAsyncWaitForContent

        public void onAsyncWaitForContent()
      • onBlockWaitForContent

        public void onBlockWaitForContent()
      • onBlockWaitForContentFailure

        public void onBlockWaitForContentFailure​(java.lang.Throwable failure)
      • run

        public void run()
        Specified by:
        run in interface java.lang.Runnable
      • handle

        public boolean handle()
        Returns:
        True if the channel is ready to continue handling (ie it is not suspended)
      • sendError

        protected void sendError​(int code,
                                 java.lang.String reason)
      • handleException

        protected void handleException​(java.lang.Throwable failure)

        Sends an error 500, performing a special logic to detect whether the request is suspended, to avoid concurrent writes from the application.

        It may happen that the application suspends, and then throws an exception, while an application spawned thread writes the response content; in such case, we attempt to commit the error directly bypassing the ErrorHandler mechanisms and the response OutputStream.

        Parameters:
        failure - the Throwable that caused the problem
      • unwrap

        protected java.lang.Throwable unwrap​(java.lang.Throwable failure,
                                             java.lang.Class<?>... targets)
        Unwrap failure causes to find target class
        Parameters:
        failure - The throwable to have its causes unwrapped
        targets - Exception classes that we should not unwrap
        Returns:
        A target throwable or null
      • isExpecting100Continue

        public boolean isExpecting100Continue()
      • isExpecting102Processing

        public boolean isExpecting102Processing()
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • onContentComplete

        public boolean onContentComplete()
      • onTrailers

        public void onTrailers​(HttpFields trailers)
      • onRequestComplete

        public boolean onRequestComplete()
      • onCompleted

        public void onCompleted()
      • onEarlyEOF

        public boolean onEarlyEOF()
      • sendResponse

        protected boolean sendResponse​(MetaData.Response info,
                                       java.nio.ByteBuffer content,
                                       boolean complete,
                                       Callback callback)
      • sendResponse

        public boolean sendResponse​(MetaData.Response info,
                                    java.nio.ByteBuffer content,
                                    boolean complete)
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • isCommitted

        public boolean isCommitted()
      • isRequestCompleted

        public boolean isRequestCompleted()
        Returns:
        True if the request lifecycle is completed
      • isResponseCompleted

        public boolean isResponseCompleted()
        Returns:
        True if the response is completely written.
      • isPersistent

        public boolean isPersistent()
      • write

        public void write​(java.nio.ByteBuffer content,
                          boolean complete,
                          Callback callback)

        Non-Blocking write, committing the response if needed.

        Called as last link in HttpOutput.Filter chain
        Specified by:
        write in interface HttpOutput.Interceptor
        Parameters:
        content - the content buffer to write
        complete - whether the content is complete for the response
        callback - Callback when complete or failed
      • execute

        protected void execute​(java.lang.Runnable task)
      • getScheduler

        public Scheduler getScheduler()
      • useDirectBuffers

        public boolean useDirectBuffers()
        Returns:
        true if the HttpChannel can efficiently use direct buffer (typically this means it is not over SSL or a multiplexed protocol)
      • abort

        public void abort​(java.lang.Throwable failure)
        If a write or similar operation to this channel fails, then this method should be called.

        The standard implementation calls HttpTransport.abort(Throwable).

        Parameters:
        failure - the failure that caused the abort.