#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

◆ size_type

Definition at line 42 of file Parser.h.

Constructor & Destructor Documentation

◆ ResponseParser() [1/3]

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

Referenced by clear().

◆ ResponseParser() [2/3]

Http::One::ResponseParser::ResponseParser ( const ResponseParser )

◆ ResponseParser() [3/3]

Http::One::ResponseParser::ResponseParser ( ResponseParser &&  )

◆ ~ResponseParser()

virtual Http::One::ResponseParser::~ResponseParser ( )

Definition at line 37 of file ResponseParser.h.

Member Function Documentation

◆ clear()

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

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 firstLineSize(), parse(), and ResponseParser().

◆ DelimiterCharacters()

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

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(), Http::One::RequestParser::parseMethodField(), Http::One::RequestParser::parseRequestFirstLine(), parseResponseFirstLine(), and Http::One::RequestParser::RequestTargetCharacters().

◆ firstLineSize()

◆ getHeaderField()

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

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.

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, Http::One::Parser::headerBlockSize(), CharacterSet::LF, LineCharacters(), LOCAL_ARRAY, Http::One::Parser::mimeHeaderBlock_, NULL, p, Parser::Tokenizer::prefix(), Parser::Tokenizer::remaining(), SBufToCstring(), Parser::Tokenizer::skipAll(), Parser::Tokenizer::skipOne(), SBuf::substr(), SBuf::trim(), and CharacterSet::WSP.

Referenced by Http::One::Parser::messageProtocol().

◆ grabMimeBlock()

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

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 occurred, or no mime terminator found within limit.

Definition at line 163 of file Parser.cc.

References Http::One::Parser::buf_, Http::One::Parser::cleanMimePrefix(), SBuf::consume(), debugs, Http::One::Parser::firstLineSize(), Http::One::Parser::hackExpectsMime_, headersEnd(), Http::One::HTTP_PARSE_DONE, SBuf::length(), AnyP::ProtocolVersion::major, Http::One::Parser::mimeHeaderBlock_, Http::One::Parser::msgProtocol_, Http::One::Parser::parseStatusCode, Http::One::Parser::parsingStage_, AnyP::PROTO_HTTP, AnyP::PROTO_ICY, AnyP::ProtocolVersion::protocol, Http::scHeaderTooLarge, and Http::One::Parser::unfoldMime().

Referenced by Http::One::RequestParser::doParse(), parse(), and Http::One::TeChunkedParser::parse().

◆ headerBlockSize()

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

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::getHeaderField(), Http::One::Parser::messageHeaderSize(), and Http::Message::parseHeader().

◆ messageHeaderSize()

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

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().

◆ messageProtocol()

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

◆ messageStatus()

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

Definition at line 45 of file ResponseParser.h.

References statusCode_.

◆ mimeHeader()

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

Definition at line 79 of file Parser.h.

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

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

◆ needsMoreData()

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

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::Parser::firstLineSize(), Http::One::HTTP_PARSE_DONE, and Http::One::Parser::parsingStage_.

Referenced by Http::One::RequestParser::doParse(), parse(), Http::One::TeChunkedParser::parse(), Adaptation::Icap::ModXact::parseBody(), Http::One::TeChunkedParser::parseChunkBody(), testHttp1Parser::testDripFeed(), testHttp1Parser::testParserConstruct(), and testResults().

◆ operator=() [1/2]

ResponseParser& Http::One::ResponseParser::operator= ( const ResponseParser )

◆ operator=() [2/2]

ResponseParser& Http::One::ResponseParser::operator= ( ResponseParser &&  )

◆ parse()

◆ parseResponseFirstLine()

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

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(), Http::One::Parser::buf_, DBG_DATA, debugs, Http::One::Parser::DelimiterCharacters(), Http::One::Parser::Http1magic, Http::One::HTTP_PARSE_DONE, IcyMagic, Parser::Tokenizer::int64(), SBuf::length(), AnyP::ProtocolVersion::major, Http::One::Parser::mimeHeaderBlock_, AnyP::ProtocolVersion::minor, Http::One::Parser::msgProtocol_, parseResponseStatusAndReason(), Http::One::Parser::parsingStage_, AnyP::PROTO_HTTP, AnyP::PROTO_ICY, AnyP::PROTO_NONE, AnyP::ProtocolVersion::protocol, Http::ProtocolVersion(), reasonPhrase_, Parser::Tokenizer::remaining(), Http::scOkay, Parser::Tokenizer::skip(), Parser::Tokenizer::skipOne(), and statusCode_.

Referenced by parse(), and reasonPhrase().

◆ parseResponseStatusAndReason()

◆ reasonPhrase()

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

◆ remaining()

const SBuf& Http::One::Parser::remaining ( ) const

◆ skipLineTerminator()

bool Http::One::Parser::skipLineTerminator ( Http1::Tokenizer tok) const

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.

Referenced by Http::One::TeChunkedParser::parseChunkEnd(), Http::One::TeChunkedParser::parseChunkExtension(), and parseResponseStatusAndReason().

◆ WhitespaceCharacters()

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

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

◆ buf_

◆ completedStatus_

bool Http::One::ResponseParser::completedStatus_ = false

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.

Referenced by parseResponseStatusAndReason().

◆ hackExpectsMime_

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

Definition at line 158 of file Parser.h.

Referenced by Http::One::Parser::grabMimeBlock().

◆ Http1magic

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

Definition at line 143 of file Parser.h.

Referenced by firstLineSize(), and parseResponseFirstLine().

◆ IcyMagic

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

Definition at line 53 of file ResponseParser.h.

Referenced by firstLineSize(), and parseResponseFirstLine().

◆ mimeHeaderBlock_

◆ msgProtocol_

◆ parseStatusCode

◆ parsingStage_

◆ reasonPhrase_

SBuf Http::One::ResponseParser::reasonPhrase_

◆ statusCode_

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

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






Web Site Translations