Class HttpParser
- java.lang.Object
-
- org.eclipse.jetty.http.HttpParser
-
public class HttpParser extends java.lang.Object
A Parser for 1.0 and 1.1 as defined by RFC7230This 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 theHttpParser.HttpHandler
instance the parser is constructed with. If the passed handler is aHttpParser.RequestHandler
then server side parsing is performed and if it is aHttpParser.ResponseHandler
, then client side parsing is done.The contract of the
HttpParser.HttpHandler
API is that if a call returns true then the call toparseNext(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 fromparseNext(ByteBuffer)
rather than from within the scope of a call likeHttpParser.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 staticHttpHeader.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 ofHttpFields
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
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
HttpParser.ComplianceHandler
static class
HttpParser.FieldState
static interface
HttpParser.HttpHandler
static interface
HttpParser.RequestHandler
static interface
HttpParser.ResponseHandler
static class
HttpParser.State
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
__STRICT
Deprecated.static Trie<HttpField>
CACHE
Cache of commonHttpField
s 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 cachedstatic int
INITIAL_URI_LENGTH
static Logger
LOG
-
Constructor Summary
Constructors Constructor Description HttpParser(HttpParser.RequestHandler handler)
HttpParser(HttpParser.RequestHandler handler, int maxHeaderBytes)
HttpParser(HttpParser.RequestHandler handler, int maxHeaderBytes, boolean strict)
Deprecated.HttpParser(HttpParser.RequestHandler handler, int maxHeaderBytes, HttpCompliance compliance)
HttpParser(HttpParser.RequestHandler handler, HttpCompliance compliance)
HttpParser(HttpParser.ResponseHandler handler)
HttpParser(HttpParser.ResponseHandler handler, int maxHeaderBytes)
HttpParser(HttpParser.ResponseHandler handler, int maxHeaderBytes, boolean strict)
Deprecated.HttpParser(HttpParser.ResponseHandler handler, int maxHeaderBytes, HttpCompliance compliance)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
atEOF()
Signal that the associated data source is at EOFprotected void
badMessage(BadMessageException x)
protected java.lang.String
caseInsensitiveHeader(java.lang.String orig, java.lang.String normative)
void
close()
Request that the associated data source be closedprotected boolean
complianceViolation(HttpComplianceSection violation)
Check RFC compliance violationprotected boolean
complianceViolation(HttpComplianceSection violation, java.lang.String reason)
Check RFC compliance violationlong
getContentLength()
long
getContentRead()
Trie<HttpField>
getFieldCache()
HttpParser.HttpHandler
getHandler()
int
getHeaderLength()
HttpCompliance
getHttpCompliance()
HttpParser.State
getState()
protected void
handleViolation(HttpComplianceSection section, java.lang.String reason)
boolean
inContentState()
boolean
inHeaderState()
boolean
isAtEOF()
boolean
isChunking()
boolean
isClose()
boolean
isClosed()
boolean
isComplete()
boolean
isIdle()
boolean
isStart()
boolean
isState(HttpParser.State state)
boolean
isTerminated()
protected boolean
parseContent(java.nio.ByteBuffer buffer)
protected boolean
parseFields(java.nio.ByteBuffer buffer)
boolean
parseNext(java.nio.ByteBuffer buffer)
Parse until next Event.void
reset()
void
setHeadResponse(boolean head)
Set if a HEAD response is expectedprotected void
setResponseStatus(int status)
protected void
setState(HttpParser.FieldState state)
protected void
setState(HttpParser.State state)
java.lang.String
toString()
-
-
-
Field Detail
-
LOG
public static final Logger LOG
-
__STRICT
@Deprecated public static final java.lang.String __STRICT
Deprecated.- See Also:
- Constant Field Values
-
INITIAL_URI_LENGTH
public static final int INITIAL_URI_LENGTH
- See Also:
- Constant Field Values
-
CACHE
public static final Trie<HttpField> CACHE
Cache of commonHttpField
s 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
- Common static combinations such as:
-
-
Constructor Detail
-
HttpParser
public HttpParser(HttpParser.RequestHandler handler)
-
HttpParser
public HttpParser(HttpParser.ResponseHandler handler)
-
HttpParser
public HttpParser(HttpParser.RequestHandler handler, int maxHeaderBytes)
-
HttpParser
public HttpParser(HttpParser.ResponseHandler handler, int maxHeaderBytes)
-
HttpParser
@Deprecated public HttpParser(HttpParser.RequestHandler handler, int maxHeaderBytes, boolean strict)
Deprecated.
-
HttpParser
@Deprecated public HttpParser(HttpParser.ResponseHandler handler, int maxHeaderBytes, boolean strict)
Deprecated.
-
HttpParser
public HttpParser(HttpParser.RequestHandler handler, HttpCompliance compliance)
-
HttpParser
public HttpParser(HttpParser.RequestHandler handler, int maxHeaderBytes, HttpCompliance compliance)
-
HttpParser
public HttpParser(HttpParser.ResponseHandler handler, int maxHeaderBytes, HttpCompliance compliance)
-
-
Method Detail
-
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, java.lang.String reason)
Check RFC compliance violation- Parameters:
violation
- The compliance section violationreason
- 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)
-
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()
-
isTerminated
public boolean isTerminated()
-
isState
public boolean isState(HttpParser.State state)
-
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;
-
badMessage
protected void badMessage(BadMessageException x)
-
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()
-
setState
protected void setState(HttpParser.State state)
-
setState
protected void setState(HttpParser.FieldState state)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
-