Class HttpParser

  • Direct Known Subclasses:
    ResponseContentParser.FCGIHttpParser

    public class HttpParser
    extends java.lang.Object
    A Parser for 1.0 and 1.1 as defined by RFC7230

    This parser parses HTTP client and server messages from buffers passed in the parseNext(ByteBuffer) method. The parsed elements of the HTTP message are passed as event calls to the HttpParser.HttpHandler instance the parser is constructed with. If the passed handler is a HttpParser.RequestHandler then server side parsing is performed and if it is a HttpParser.ResponseHandler, then client side parsing is done.

    The contract of the HttpParser.HttpHandler API is that if a call returns true then the call to parseNext(ByteBuffer) will return as soon as possible also with a true response. Typically this indicates that the parsing has reached a stage where the caller should process the events accumulated by the handler. It is the preferred calling style that handling such as calling a servlet to process a request, should be done after a true return from parseNext(ByteBuffer) rather than from within the scope of a call like HttpParser.HttpHandler.messageComplete()

    For performance, the parse is heavily dependent on the Trie.getBest(ByteBuffer, int, int) method to look ahead in a single pass for both the structure ( : and CRLF ) and semantic (which header and value) of a header. Specifically the static HttpHeader.CACHE is used to lookup common combinations of headers and values (eg. "Connection: close"), or just header names (eg. "Connection:" ). For headers who's value is not known statically (eg. Host, COOKIE) then a per parser dynamic Trie of HttpFields from previous parsed messages is used to help the parsing of subsequent messages.

    The parser can work in varying compliance modes:

    RFC7230
    (default) Compliance with RFC7230
    RFC2616
    Wrapped headers and HTTP/0.9 supported
    LEGACY
    (aka STRICT) Adherence to Servlet Specification requirement for exact case of header names, bypassing the header caches, which are case insensitive, otherwise equivalent to RFC2616
    See Also:
    RFC 7230
    • Field Detail

      • LOG

        public static final Logger LOG
      • __STRICT

        @Deprecated
        public static final java.lang.String __STRICT
        Deprecated.
        See Also:
        Constant Field Values
      • CACHE

        public static final Trie<HttpField> CACHE
        Cache of common HttpFields including:
        • Common static combinations such as:
          • Connection: close
          • Accept-Encoding: gzip
          • Content-Length: 0
        • Combinations of Content-Type header for common mime types by common charsets
        • Most common headers with null values so that a lookup will at least determine the header name even if the name:value combination is not cached
      • __idleStates

        private static final java.util.EnumSet<HttpParser.State> __idleStates
      • __completeStates

        private static final java.util.EnumSet<HttpParser.State> __completeStates
      • __terminatedStates

        private static final java.util.EnumSet<HttpParser.State> __terminatedStates
      • debug

        private final boolean debug
      • _maxHeaderBytes

        private final int _maxHeaderBytes
      • _headerString

        private java.lang.String _headerString
      • _valueString

        private java.lang.String _valueString
      • _responseStatus

        private int _responseStatus
      • _headerBytes

        private int _headerBytes
      • _host

        private boolean _host
      • _headerComplete

        private boolean _headerComplete
      • _eof

        private volatile boolean _eof
      • _methodString

        private java.lang.String _methodString
      • _hasContentLength

        private boolean _hasContentLength
      • _hasTransferEncoding

        private boolean _hasTransferEncoding
      • _contentLength

        private long _contentLength
      • _contentPosition

        private long _contentPosition
      • _chunkLength

        private int _chunkLength
      • _chunkPosition

        private int _chunkPosition
      • _headResponse

        private boolean _headResponse
      • _cr

        private boolean _cr
      • _contentChunk

        private java.nio.ByteBuffer _contentChunk
      • _length

        private int _length
      • _string

        private final java.lang.StringBuilder _string
    • Method Detail

      • complianceViolation

        protected boolean complianceViolation​(HttpComplianceSection violation)
        Check RFC compliance violation
        Parameters:
        violation - The compliance section violation
        Returns:
        True if the current compliance level is set so as to Not allow this violation
      • complianceViolation

        protected boolean complianceViolation​(HttpComplianceSection violation,
                                              java.lang.String reason)
        Check RFC compliance violation
        Parameters:
        violation - The compliance section violation
        reason - The reason for the violation
        Returns:
        True if the current compliance level is set so as to Not allow this violation
      • handleViolation

        protected void handleViolation​(HttpComplianceSection section,
                                       java.lang.String reason)
      • caseInsensitiveHeader

        protected java.lang.String caseInsensitiveHeader​(java.lang.String orig,
                                                         java.lang.String normative)
      • getContentLength

        public long getContentLength()
      • getContentRead

        public long getContentRead()
      • getHeaderLength

        public int getHeaderLength()
      • setHeadResponse

        public void setHeadResponse​(boolean head)
        Set if a HEAD response is expected
        Parameters:
        head - true if head response is expected
      • setResponseStatus

        protected void setResponseStatus​(int status)
      • inContentState

        public boolean inContentState()
      • inHeaderState

        public boolean inHeaderState()
      • isChunking

        public boolean isChunking()
      • isStart

        public boolean isStart()
      • isClose

        public boolean isClose()
      • isClosed

        public boolean isClosed()
      • isIdle

        public boolean isIdle()
      • isComplete

        public boolean isComplete()
      • isTerminated

        public boolean isTerminated()
      • quickStart

        private void quickStart​(java.nio.ByteBuffer buffer)
      • setString

        private void setString​(java.lang.String s)
      • takeString

        private java.lang.String takeString()
      • handleHeaderContentMessage

        private boolean handleHeaderContentMessage()
      • handleContentMessage

        private boolean handleContentMessage()
      • parseLine

        private boolean parseLine​(java.nio.ByteBuffer buffer)
      • checkVersion

        private void checkVersion()
      • parsedHeader

        private void parsedHeader()
      • parsedTrailer

        private void parsedTrailer()
      • convertContentLength

        private long convertContentLength​(java.lang.String valueString)
      • parseFields

        protected boolean parseFields​(java.nio.ByteBuffer buffer)
      • parseNext

        public boolean parseNext​(java.nio.ByteBuffer buffer)
        Parse until next Event.
        Parameters:
        buffer - the buffer to parse
        Returns:
        True if an HttpParser.RequestHandler method was called and it returned true;
      • parseContent

        protected boolean parseContent​(java.nio.ByteBuffer buffer)
      • isAtEOF

        public boolean isAtEOF()
      • atEOF

        public void atEOF()
        Signal that the associated data source is at EOF
      • close

        public void close()
        Request that the associated data source be closed
      • reset

        public void reset()
      • toString

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