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 Index.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
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: