#include <ResponseParser.h>

Inheritance diagram for Http::One::ResponseParser:
Collaboration diagram for Http::One::ResponseParser:

Public Types

typedef SBuf::size_type size_type
 

Public Member Functions

 ResponseParser ()=default
 
 ResponseParser (const ResponseParser &)=default
 
ResponseParseroperator= (const ResponseParser &)=default
 
 ResponseParser (ResponseParser &&)=default
 
ResponseParseroperator= (ResponseParser &&)=default
 
virtual ~ResponseParser ()
 
virtual void clear ()
 
virtual Http1::Parser::size_type firstLineSize () const
 size in bytes of the first line including CRLF terminator More...
 
virtual bool parse (const SBuf &aBuf)
 
Http::StatusCode messageStatus () const
 
SBuf reasonPhrase () const
 
bool needsMoreData () const
 
size_type headerBlockSize () const
 
size_type messageHeaderSize () const
 
SBuf mimeHeader () const
 buffer containing HTTP mime headers, excluding message first-line. More...
 
const AnyP::ProtocolVersionmessageProtocol () const
 the protocol label for this message More...
 
char * getHeaderField (const char *name)
 
const SBufremaining () const
 the remaining unprocessed section of buffer More...
 

Static Public Member Functions

static const CharacterSetWhitespaceCharacters ()
 
static const CharacterSetDelimiterCharacters ()
 

Public Attributes

Http::StatusCode parseStatusCode = Http::scNone
 

Protected Member Functions

bool skipLineTerminator (Http1::Tokenizer &tok) const
 
bool grabMimeBlock (const char *which, const size_t limit)
 

Protected Attributes

SBuf buf_
 bytes remaining to be parsed More...
 
ParseState parsingStage_ = HTTP_PARSE_NONE
 what stage the parser is currently up to More...
 
AnyP::ProtocolVersion msgProtocol_
 what protocol label has been found in the first line (if any) More...
 
SBuf mimeHeaderBlock_
 buffer holding the mime headers (if any) More...
 
bool hackExpectsMime_ = false
 Whether the invalid HTTP as HTTP/0.9 hack expects a mime header block. More...
 

Static Protected Attributes

static const SBuf Http1magic
 RFC 7230 section 2.6 - 7 magic octets. More...
 

Private Member Functions

int parseResponseFirstLine ()
 
int parseResponseStatusAndReason (Http1::Tokenizer &, const CharacterSet &)
 

Private Attributes

bool completedStatus_ = false
 
Http::StatusCode statusCode_ = Http::scNone
 HTTP/1 status-line status code. More...
 
SBuf reasonPhrase_
 HTTP/1 status-line reason phrase. More...
 

Static Private Attributes

static const SBuf IcyMagic
 magic prefix for identifying ICY response messages More...
 

Detailed Description

HTTP/1.x protocol response parser

Also capable of parsing unexpected ICY responses and upgrading HTTP/0.9 syntax responses to HTTP/1.1

Works on a raw character I/O buffer and tokenizes the content into the major CRLF delimited segments of an HTTP/1 respone message:

status-line (version SP status SP reash-phrase) mime-header (set of RFC2616 syntax header fields)

Definition at line 29 of file ResponseParser.h.

Member Typedef Documentation

Definition at line 42 of file Parser.h.

Constructor & Destructor Documentation

Http::One::ResponseParser::ResponseParser ( )
default

Referenced by clear().

Http::One::ResponseParser::ResponseParser ( const ResponseParser )
default
Http::One::ResponseParser::ResponseParser ( ResponseParser &&  )
default
virtual Http::One::ResponseParser::~ResponseParser ( )
inlinevirtual

Definition at line 37 of file ResponseParser.h.

Member Function Documentation

virtual void Http::One::ResponseParser::clear ( )
inlinevirtual

Set this parser back to a default state. Will DROP any reference to a buffer (does not free).

Implements Http::One::Parser.

Definition at line 40 of file ResponseParser.h.

References ResponseParser().

const CharacterSet & Http::One::Parser::DelimiterCharacters ( )
staticinherited

Whitespace between protocol elements in restricted contexts like request line, status line, asctime-date, and credentials Seen in RFCs as SP but may be "relaxed" by us. See also: WhitespaceCharacters(). XXX: Misnamed and overused.

Definition at line 58 of file Parser.cc.

References Config, SquidConfig::onoff, SquidConfig::relaxed_header_parser, RelaxedDelimiterCharacters(), and CharacterSet::SP.

Referenced by Http::ContentLengthInterpreter::goodSuffix().

char * Http::One::Parser::getHeaderField ( const char *  name)
inherited

Scan the mime header block (badly) for a header with the given name.

BUG: omits lines when searching for headers with obs-fold or multiple entries.

BUG: limits output to just 1KB when Squid accepts up to 64KB line length.

Returns
A pointer to a field-value of the first matching field-name, or NULL.

Definition at line 219 of file Parser.cc.

References SBuf::caseCmp(), SBuf::chop(), SBuf::consume(), Http::One::CrLf(), debugs, GET_HDR_SZ, CharacterSet::LF, LineCharacters(), LOCAL_ARRAY, NULL, p, Parser::Tokenizer::prefix(), Parser::Tokenizer::remaining(), SBufToCstring(), Parser::Tokenizer::skipAll(), Parser::Tokenizer::skipOne(), SBuf::substr(), SBuf::trim(), and CharacterSet::WSP.

bool Http::One::Parser::grabMimeBlock ( const char *  which,
const size_t  limit 
)
protectedinherited

Scan to find the mime headers block for current message.

Return values
trueIf mime block (or a blocks non-existence) has been identified accurately within limit characters. mimeHeaderBlock_ has been updated and buf_ consumed.
falseAn error occured, or no mime terminator found within limit.

Definition at line 163 of file Parser.cc.

References debugs, headersEnd(), Http::One::HTTP_PARSE_DONE, AnyP::PROTO_HTTP, AnyP::PROTO_ICY, and Http::scHeaderTooLarge.

size_type Http::One::Parser::headerBlockSize ( ) const
inlineinherited

size in bytes of the message headers including CRLF terminator(s) but excluding first-line bytes

Definition at line 71 of file Parser.h.

References SBuf::length(), and Http::One::Parser::mimeHeaderBlock_.

Referenced by Http::One::Parser::messageHeaderSize(), and Http::Message::parseHeader().

size_type Http::One::Parser::messageHeaderSize ( ) const
inlineinherited

size in bytes of HTTP message block, includes first-line and mime headers excludes any body/entity/payload bytes excludes any garbage prefix before the first-line

Definition at line 76 of file Parser.h.

References Http::One::Parser::firstLineSize(), and Http::One::Parser::headerBlockSize().

Referenced by Http::Message::parseHeader().

const AnyP::ProtocolVersion& Http::One::Parser::messageProtocol ( ) const
inlineinherited

Definition at line 82 of file Parser.h.

References Http::One::Parser::msgProtocol_.

Http::StatusCode Http::One::ResponseParser::messageStatus ( ) const
inline

Definition at line 45 of file ResponseParser.h.

References statusCode_.

SBuf Http::One::Parser::mimeHeader ( ) const
inlineinherited

Definition at line 79 of file Parser.h.

References Http::One::Parser::mimeHeaderBlock_.

Referenced by Http::Message::parseHeader().

bool Http::One::Parser::needsMoreData ( ) const
inlineinherited

Whether the parser is waiting on more data to complete parsing a message. Use to distinguish between incomplete data and error results when parse() returns false.

Definition at line 64 of file Parser.h.

References Http::One::HTTP_PARSE_DONE, and Http::One::Parser::parsingStage_.

Referenced by ConnStateData::handleChunkedRequestBody(), testHttp1Parser::testDripFeed(), testHttp1Parser::testParserConstruct(), and testResults().

ResponseParser& Http::One::ResponseParser::operator= ( const ResponseParser )
default
ResponseParser& Http::One::ResponseParser::operator= ( ResponseParser &&  )
default
bool Http::One::ResponseParser::parse ( const SBuf aBuf)
virtual

attempt to parse a message from the buffer

Return values
trueif a full message was found and parsed
falseif incomplete, invalid or no message was found

Implements Http::One::Parser.

Definition at line 196 of file ResponseParser.cc.

References Config, DBG_DATA, debugs, Http::One::HTTP_PARSE_DONE, Http::One::HTTP_PARSE_FIRST, Http::One::HTTP_PARSE_MIME, Http::One::HTTP_PARSE_NONE, SBuf::length(), SquidConfig::maxReplyHeaderSize, PROF_start, PROF_stop, and Http::scInvalidHeader.

int Http::One::ResponseParser::parseResponseFirstLine ( )
private

Attempt to parse the method field out of an HTTP message status-line.

Governed by: RFC 1945 section 6.1 RFC 7230 section 2.6, 3.1 and 3.5

Parsing state is stored between calls. The current implementation uses checkpoints after each successful status-line field. The return value tells you whether the parsing is completed or not.

Return values
-1an error occurred.
1successful parse. statusCode_ and maybe reasonPhrase_ are filled and buffer consumed including first delimiter.
0more data is needed to complete the parse

Definition at line 120 of file ResponseParser.cc.

References Parser::Tokenizer::atEnd(), Config, CharacterSet::CR, DBG_DATA, debugs, CharacterSet::HTAB, Http::One::HTTP_PARSE_DONE, Parser::Tokenizer::int64(), SBuf::length(), SquidConfig::onoff, AnyP::PROTO_HTTP, AnyP::PROTO_ICY, AnyP::PROTO_NONE, Http::ProtocolVersion(), SquidConfig::relaxed_header_parser, Parser::Tokenizer::remaining(), Http::scOkay, Parser::Tokenizer::skip(), Parser::Tokenizer::skipOne(), and CharacterSet::SP.

SBuf Http::One::ResponseParser::reasonPhrase ( ) const
inline

Definition at line 46 of file ResponseParser.h.

References reasonPhrase_.

const SBuf& Http::One::Parser::remaining ( ) const
inlineinherited
bool Http::One::Parser::skipLineTerminator ( Http1::Tokenizer tok) const
protectedinherited

detect and skip the CRLF or (if tolerant) LF line terminator consume from the tokenizer.

throws if non-terminator is detected.

Return values
trueonly if line terminator found.
falseincomplete or missing line terminator, need more data.

Definition at line 65 of file Parser.cc.

References SBuf::at(), Parser::Tokenizer::atEnd(), Config, Http::One::CrLf(), SBuf::length(), CharacterSet::LF, SquidConfig::onoff, SquidConfig::relaxed_header_parser, Parser::Tokenizer::remaining(), Parser::Tokenizer::skip(), Parser::Tokenizer::skipOne(), and TexcHere.

const CharacterSet & Http::One::Parser::WhitespaceCharacters ( )
staticinherited

Whitespace between regular protocol elements. Seen in RFCs as OWS, RWS, BWS, SP/HTAB but may be "relaxed" by us. See also: DelimiterCharacters().

Definition at line 51 of file Parser.cc.

References Config, SquidConfig::onoff, SquidConfig::relaxed_header_parser, RelaxedDelimiterCharacters(), and CharacterSet::WSP.

Referenced by Http::One::ParseBws().

Member Data Documentation

SBuf Http::One::Parser::buf_
protectedinherited
bool Http::One::ResponseParser::completedStatus_ = false
private

Whether we found the status code yet. We cannot rely on status value because server may send "000".

Definition at line 57 of file ResponseParser.h.

bool Http::One::Parser::hackExpectsMime_ = false
protectedinherited

Definition at line 158 of file Parser.h.

const SBuf Http::One::Parser::Http1magic
staticprotectedinherited

Definition at line 143 of file Parser.h.

Referenced by firstLineSize().

const SBuf Http::One::ResponseParser::IcyMagic
staticprivate

Definition at line 53 of file ResponseParser.h.

Referenced by firstLineSize().

SBuf Http::One::Parser::mimeHeaderBlock_
protectedinherited
Http::StatusCode Http::One::Parser::parseStatusCode = Http::scNone
inherited

HTTP status code resulting from the parse process. to be used on the invalid message handling.

Http::scNone indicates incomplete parse, Http::scOkay indicates no error, other codes represent a parse error.

Definition at line 106 of file Parser.h.

Referenced by testHttp1Parser::testParserConstruct(), and testResults().

ParseState Http::One::Parser::parsingStage_ = HTTP_PARSE_NONE
protectedinherited
SBuf Http::One::ResponseParser::reasonPhrase_
private

Definition at line 63 of file ResponseParser.h.

Referenced by firstLineSize(), and reasonPhrase().

Http::StatusCode Http::One::ResponseParser::statusCode_ = Http::scNone
private

Definition at line 60 of file ResponseParser.h.

Referenced by messageStatus().


The documentation for this class was generated from the following files:

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors