refactor request parser to use C++11 idioms, plus a couple of consts
This commit is contained in:
parent
601eff1af6
commit
fe7b436a8c
@ -33,11 +33,11 @@ namespace http
|
||||
{
|
||||
|
||||
RequestParser::RequestParser()
|
||||
: state_(method_start), header({"", ""}), compression_type(noCompression)
|
||||
: state(internal_state::method_start), header({"", ""}), compression_type(noCompression)
|
||||
{
|
||||
}
|
||||
|
||||
void RequestParser::Reset() { state_ = method_start; }
|
||||
void RequestParser::Reset() { state = internal_state::method_start; }
|
||||
|
||||
std::tuple<osrm::tribool, CompressionType>
|
||||
RequestParser::Parse(Request &req, char *begin, char *end)
|
||||
@ -56,125 +56,125 @@ RequestParser::Parse(Request &req, char *begin, char *end)
|
||||
|
||||
osrm::tribool RequestParser::consume(Request &req, char input)
|
||||
{
|
||||
switch (state_)
|
||||
switch (state)
|
||||
{
|
||||
case method_start:
|
||||
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||
case internal_state::method_start:
|
||||
if (!is_char(input) || is_CTL(input) || is_special(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
state_ = method;
|
||||
state = internal_state::method;
|
||||
return osrm::tribool::indeterminate;
|
||||
case method:
|
||||
case internal_state::method:
|
||||
if (input == ' ')
|
||||
{
|
||||
state_ = uri;
|
||||
state = internal_state::uri;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||
if (!is_char(input) || is_CTL(input) || is_special(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
return osrm::tribool::indeterminate;
|
||||
case uri_start:
|
||||
if (isCTL(input))
|
||||
case internal_state::uri_start:
|
||||
if (is_CTL(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
state_ = uri;
|
||||
state = internal_state::uri;
|
||||
req.uri.push_back(input);
|
||||
return osrm::tribool::indeterminate;
|
||||
case uri:
|
||||
case internal_state::uri:
|
||||
if (input == ' ')
|
||||
{
|
||||
state_ = http_version_h;
|
||||
state = internal_state::http_version_h;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (isCTL(input))
|
||||
if (is_CTL(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
req.uri.push_back(input);
|
||||
return osrm::tribool::indeterminate;
|
||||
case http_version_h:
|
||||
case internal_state::http_version_h:
|
||||
if (input == 'H')
|
||||
{
|
||||
state_ = http_version_t_1;
|
||||
state = internal_state::http_version_t_1;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_t_1:
|
||||
case internal_state::http_version_t_1:
|
||||
if (input == 'T')
|
||||
{
|
||||
state_ = http_version_t_2;
|
||||
state = internal_state::http_version_t_2;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_t_2:
|
||||
case internal_state::http_version_t_2:
|
||||
if (input == 'T')
|
||||
{
|
||||
state_ = http_version_p;
|
||||
state = internal_state::http_version_p;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_p:
|
||||
case internal_state::http_version_p:
|
||||
if (input == 'P')
|
||||
{
|
||||
state_ = http_version_slash;
|
||||
state = internal_state::http_version_slash;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_slash:
|
||||
case internal_state::http_version_slash:
|
||||
if (input == '/')
|
||||
{
|
||||
state_ = http_version_major_start;
|
||||
state = internal_state::http_version_major_start;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_major_start:
|
||||
if (isDigit(input))
|
||||
case internal_state::http_version_major_start:
|
||||
if (is_digit(input))
|
||||
{
|
||||
state_ = http_version_major;
|
||||
state = internal_state::http_version_major;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_major:
|
||||
case internal_state::http_version_major:
|
||||
if (input == '.')
|
||||
{
|
||||
state_ = http_version_minor_start;
|
||||
state = internal_state::http_version_minor_start;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (isDigit(input))
|
||||
if (is_digit(input))
|
||||
{
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_minor_start:
|
||||
if (isDigit(input))
|
||||
case internal_state::http_version_minor_start:
|
||||
if (is_digit(input))
|
||||
{
|
||||
state_ = http_version_minor;
|
||||
state = internal_state::http_version_minor;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case http_version_minor:
|
||||
case internal_state::http_version_minor:
|
||||
if (input == '\r')
|
||||
{
|
||||
state_ = expecting_newline_1;
|
||||
state = internal_state::expecting_newline_1;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (isDigit(input))
|
||||
if (is_digit(input))
|
||||
{
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case expecting_newline_1:
|
||||
case internal_state::expecting_newline_1:
|
||||
if (input == '\n')
|
||||
{
|
||||
state_ = header_line_start;
|
||||
state = internal_state::header_line_start;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case header_line_start:
|
||||
case internal_state::header_line_start:
|
||||
if (header.name == "Accept-Encoding")
|
||||
{
|
||||
/* giving gzip precedence over deflate */
|
||||
@ -200,86 +200,84 @@ osrm::tribool RequestParser::consume(Request &req, char input)
|
||||
|
||||
if (input == '\r')
|
||||
{
|
||||
state_ = expecting_newline_3;
|
||||
state = internal_state::expecting_newline_3;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||
if (!is_char(input) || is_CTL(input) || is_special(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
state_ = header_name;
|
||||
state = internal_state::header_name;
|
||||
header.Clear();
|
||||
header.name.push_back(input);
|
||||
return osrm::tribool::indeterminate;
|
||||
case header_lws:
|
||||
case internal_state::header_lws:
|
||||
if (input == '\r')
|
||||
{
|
||||
state_ = expecting_newline_2;
|
||||
state = internal_state::expecting_newline_2;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (input == ' ' || input == '\t')
|
||||
{
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (isCTL(input))
|
||||
if (is_CTL(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
state_ = header_value;
|
||||
state = internal_state::header_value;
|
||||
return osrm::tribool::indeterminate;
|
||||
case header_name:
|
||||
case internal_state::header_name:
|
||||
if (input == ':')
|
||||
{
|
||||
state_ = space_before_header_value;
|
||||
state = internal_state::space_before_header_value;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||
if (!is_char(input) || is_CTL(input) || is_special(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
header.name.push_back(input);
|
||||
return osrm::tribool::indeterminate;
|
||||
case space_before_header_value:
|
||||
case internal_state::space_before_header_value:
|
||||
if (input == ' ')
|
||||
{
|
||||
state_ = header_value;
|
||||
state = internal_state::header_value;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
case header_value:
|
||||
case internal_state::header_value:
|
||||
if (input == '\r')
|
||||
{
|
||||
state_ = expecting_newline_2;
|
||||
state = internal_state::expecting_newline_2;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
if (isCTL(input))
|
||||
if (is_CTL(input))
|
||||
{
|
||||
return osrm::tribool::no;
|
||||
}
|
||||
header.value.push_back(input);
|
||||
return osrm::tribool::indeterminate;
|
||||
case expecting_newline_2:
|
||||
case internal_state::expecting_newline_2:
|
||||
if (input == '\n')
|
||||
{
|
||||
state_ = header_line_start;
|
||||
state = internal_state::header_line_start;
|
||||
return osrm::tribool::indeterminate;
|
||||
}
|
||||
return osrm::tribool::no;
|
||||
default: // expecting_newline_3
|
||||
return (input == '\n' ? osrm::tribool::yes : osrm::tribool::no);
|
||||
// default:
|
||||
// return osrm::tribool::no;
|
||||
}
|
||||
}
|
||||
|
||||
inline bool RequestParser::isChar(int character) { return character >= 0 && character <= 127; }
|
||||
bool RequestParser::is_char(int character) const { return character >= 0 && character <= 127; }
|
||||
|
||||
inline bool RequestParser::isCTL(int character)
|
||||
bool RequestParser::is_CTL(int character) const
|
||||
{
|
||||
return (character >= 0 && character <= 31) || (character == 127);
|
||||
}
|
||||
|
||||
inline bool RequestParser::isTSpecial(int character)
|
||||
bool RequestParser::is_special(int character) const
|
||||
{
|
||||
switch (character)
|
||||
{
|
||||
@ -308,5 +306,5 @@ inline bool RequestParser::isTSpecial(int character)
|
||||
}
|
||||
}
|
||||
|
||||
inline bool RequestParser::isDigit(int character) { return character >= '0' && character <= '9'; }
|
||||
bool RequestParser::is_digit(int character) const { return character >= '0' && character <= '9'; }
|
||||
}
|
||||
|
@ -50,15 +50,15 @@ class RequestParser
|
||||
private:
|
||||
osrm::tribool consume(Request &req, char input);
|
||||
|
||||
inline bool isChar(int c);
|
||||
bool is_char(int c) const;
|
||||
|
||||
inline bool isCTL(int c);
|
||||
bool is_CTL(int c) const;
|
||||
|
||||
inline bool isTSpecial(int c);
|
||||
bool is_special(int c) const;
|
||||
|
||||
inline bool isDigit(int c);
|
||||
bool is_digit(int c) const;
|
||||
|
||||
enum state
|
||||
enum class internal_state : unsigned char
|
||||
{
|
||||
method_start,
|
||||
method,
|
||||
@ -81,7 +81,7 @@ class RequestParser
|
||||
header_value,
|
||||
expecting_newline_2,
|
||||
expecting_newline_3
|
||||
} state_;
|
||||
} state;
|
||||
|
||||
Header header;
|
||||
CompressionType compression_type;
|
||||
|
Loading…
Reference in New Issue
Block a user