Http Parser

namespace HTTPServer

Enums

enum class ParseState

Values:

enumerator REQUEST_LINE
enumerator HEADERS
enumerator BODY
enumerator COMPLETE
enumerator ERROR
enum class BodyType

Values:

enumerator NONE
enumerator CONTENT_LENGTH
enumerator CHUNKED
enum class ChunkState

Values:

enumerator SIZE
enumerator DATA
enumerator DATA_CRLF
enumerator TRAILERS
enumerator DONE
enum class ParseResult

Values:

enumerator NEED_MORE_DATA
enumerator REQUEST_COMPLETE
enumerator PARSE_ERROR
enum class ParseError

Values:

enumerator NONE
enumerator INVALID_REQUEST_LINE_FORMAT
enumerator REQUEST_METHOD_EMPTY
enumerator REQUEST_METHOD_LOWERCASE
enumerator UNSUPPORTED_METHOD
enumerator UNSUPPORTED_VERSION
enumerator INVALID_HEADER_MISSING_COLON
enumerator INVALID_HEADER_UNSUPPORTED_CHARACTER
enumerator HEADER_TOO_LARGE
enumerator MISSING_HOST_HEADER
enumerator CONTENT_LENGTH_EMPTY
enumerator CONTENT_LENGTH_NOT_NUMERIC
enumerator BODY_TOO_LARGE
enumerator INVALID_CHUNKED_ENCODING
enumerator TOO_MANY_HEADERS
enumerator TOTAL_HEADER_SIZE_TOO_LARGE
class HttpParser

Public Functions

HttpParser()
ParseResult parse(std::string_view &buffer)

Feed new bytes into the parser. Consumes as much as possible from buffer and leaves any unconsumed bytes in buffer

bool hasCompleteRequest() const
HttpRequest takeRequest()
bool hasError() const
ParseError error() const
void reset()

Prepare parser for next request (pipelining)

Private Functions

bool parseRequestLine(std::string_view &buffer)

Internal parsing methods

bool parseHeaders(std::string_view &buffer)
bool determineBodyFraming()
bool parseBody(std::string_view &buffer)
bool parseChunkSize(std::string_view &buffer)
bool parseChunkData(std::string_view &buffer)
bool parseChunkTrailers(std::string_view &buffer)
bool consumeLine(std::string_view &buffer, std::string &out)
bool validateRequestLine()
bool validateHeaders()
void parseQueryParams(const std::string &qs, std::unordered_map<std::string, std::string> &map)
std::string urlDecode(const std::string &s)

Private Members

ParseState d_state = ParseState::REQUEST_LINE
BodyType d_bodyType = BodyType::NONE
ChunkState d_chunkState = ChunkState::SIZE
ParseError d_error = ParseError::NONE
HttpRequest d_request
std::string d_lineBuffer

Temporary Buffers

size_t d_bodyBytesRemaining = 0
size_t d_currentChunkSize = 0
size_t d_currentChunkRead = 0
size_t d_currentHeaderCount = 0
size_t d_currentTotalHeaderSize = 0