Class HttpParser

java.lang.Object
org.eclipse.jetty.http.HttpParser

public class HttpParser extends 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:
  • Field Details

    • LOG

      public static final Logger LOG
    • __STRICT

      @Deprecated public static final String __STRICT
      Deprecated.
      See Also:
    • INITIAL_URI_LENGTH

      public static final int INITIAL_URI_LENGTH
      See Also:
    • MAX_CHUNK_LENGTH

      private static final int MAX_CHUNK_LENGTH
      See Also:
    • 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
    • NO_CACHE

      private static final Trie<HttpField> NO_CACHE
    • __idleStates

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

      private static final EnumSet<HttpParser.State> __completeStates
    • debug

      private final boolean debug
    • _handler

      private final HttpParser.HttpHandler _handler
    • _requestHandler

      private final HttpParser.RequestHandler _requestHandler
    • _responseHandler

      private final HttpParser.ResponseHandler _responseHandler
    • _complianceHandler

      private final HttpParser.ComplianceHandler _complianceHandler
    • _maxHeaderBytes

      private final int _maxHeaderBytes
    • _compliance

      private final HttpCompliance _compliance
    • _compliances

      private final EnumSet<HttpComplianceSection> _compliances
    • _uri

      private final Utf8StringBuilder _uri
    • _field

      private HttpField _field
    • _header

      private HttpHeader _header
    • _headerString

      private String _headerString
    • _valueString

      private String _valueString
    • _responseStatus

      private int _responseStatus
    • _headerBytes

      private int _headerBytes
    • _host

      private boolean _host
    • _headerComplete

      private boolean _headerComplete
    • _state

      private volatile HttpParser.State _state
    • _fieldState

      private volatile HttpParser.FieldState _fieldState
    • _eof

      private volatile boolean _eof
    • _method

      private HttpMethod _method
    • _methodString

      private String _methodString
    • _version

      private HttpVersion _version
    • _endOfContent

      private HttpTokens.EndOfContent _endOfContent
    • _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 ByteBuffer _contentChunk
    • _fieldCache

      private Trie<HttpField> _fieldCache
    • _length

      private int _length
    • _string

      private final StringBuilder _string
  • Constructor Details

  • Method Details

    • compliance

      private static HttpCompliance compliance()
    • getHandler

      public HttpParser.HttpHandler getHandler()
    • getHttpCompliance

      public HttpCompliance getHttpCompliance()
    • 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, 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, String reason)
    • caseInsensitiveHeader

      protected String caseInsensitiveHeader(String orig, 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)
    • getState

      public HttpParser.State getState()
    • 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()
    • isState

      public boolean isState(HttpParser.State state)
    • next

      private HttpTokens.Token next(ByteBuffer buffer)
    • quickStart

      private boolean quickStart(ByteBuffer buffer)
    • setString

      private void setString(String s)
    • takeString

      private String takeString()
    • handleHeaderContentMessage

      private boolean handleHeaderContentMessage()
    • handleContentMessage

      private boolean handleContentMessage()
    • parseLine

      private boolean parseLine(ByteBuffer buffer)
    • checkVersion

      private void checkVersion()
    • parsedHeader

      private void parsedHeader()
    • parsedTrailer

      private void parsedTrailer()
    • convertContentLength

      private long convertContentLength(String valueString)
    • parseFields

      protected boolean parseFields(ByteBuffer buffer)
    • parseNext

      public boolean parseNext(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;
    • badMessage

      protected void badMessage(BadMessageException x)
    • parseContent

      protected boolean parseContent(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()
    • setState

      protected void setState(HttpParser.State state)
    • setState

      protected void setState(HttpParser.FieldState state)
    • getFieldCache

      public Trie<HttpField> getFieldCache()
    • toString

      public String toString()
      Overrides:
      toString in class Object