remove unnecessary else statements
This commit is contained in:
parent
7955066d5c
commit
45f0af2afc
@ -38,11 +38,13 @@ boost::tuple<boost::tribool, char*> RequestParser::Parse(
|
|||||||
Request& req,
|
Request& req,
|
||||||
char* begin,
|
char* begin,
|
||||||
char* end,
|
char* end,
|
||||||
http::CompressionType * compressionType
|
http::CompressionType * compressionType)
|
||||||
) {
|
{
|
||||||
while (begin != end) {
|
while (begin != end)
|
||||||
|
{
|
||||||
boost::tribool result = consume(req, *begin++, compressionType);
|
boost::tribool result = consume(req, *begin++, compressionType);
|
||||||
if (result || !result){
|
if (result || !result)
|
||||||
|
{
|
||||||
return boost::make_tuple(result, begin);
|
return boost::make_tuple(result, begin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -50,193 +52,216 @@ boost::tuple<boost::tribool, char*> RequestParser::Parse(
|
|||||||
return boost::make_tuple(result, begin);
|
return boost::make_tuple(result, begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::tribool RequestParser::consume(
|
boost::tribool RequestParser::consume(Request& req, char input, http::CompressionType * compressionType)
|
||||||
Request& req, char input,
|
{
|
||||||
http::CompressionType * compressionType
|
switch (state_)
|
||||||
) {
|
{
|
||||||
switch (state_) {
|
|
||||||
case method_start:
|
case method_start:
|
||||||
if (!isChar(input) || isCTL(input) || isTSpecial(input)) {
|
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
} else {
|
|
||||||
state_ = method;
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
state_ = method;
|
||||||
|
return boost::indeterminate;
|
||||||
case method:
|
case method:
|
||||||
if (input == ' ') {
|
if (input == ' ')
|
||||||
|
{
|
||||||
state_ = uri;
|
state_ = uri;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (!isChar(input) || isCTL(input) || isTSpecial(input)) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return boost::indeterminate;
|
||||||
case uri_start:
|
case uri_start:
|
||||||
if (isCTL(input)) {
|
if (isCTL(input))
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
} else {
|
|
||||||
state_ = uri;
|
|
||||||
req.uri.push_back(input);
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
state_ = uri;
|
||||||
|
req.uri.push_back(input);
|
||||||
|
return boost::indeterminate;
|
||||||
case uri:
|
case uri:
|
||||||
if (input == ' ') {
|
if (input == ' ')
|
||||||
|
{
|
||||||
state_ = http_version_h;
|
state_ = http_version_h;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (isCTL(input)) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
req.uri.push_back(input);
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
if (isCTL(input))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
req.uri.push_back(input);
|
||||||
|
return boost::indeterminate;
|
||||||
case http_version_h:
|
case http_version_h:
|
||||||
if (input == 'H') {
|
if (input == 'H')
|
||||||
|
{
|
||||||
state_ = http_version_t_1;
|
state_ = http_version_t_1;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_t_1:
|
case http_version_t_1:
|
||||||
if (input == 'T') {
|
if (input == 'T')
|
||||||
|
{
|
||||||
state_ = http_version_t_2;
|
state_ = http_version_t_2;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_t_2:
|
case http_version_t_2:
|
||||||
if (input == 'T') {
|
if (input == 'T')
|
||||||
|
{
|
||||||
state_ = http_version_p;
|
state_ = http_version_p;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_p:
|
case http_version_p:
|
||||||
if (input == 'P') {
|
if (input == 'P')
|
||||||
|
{
|
||||||
state_ = http_version_slash;
|
state_ = http_version_slash;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_slash:
|
case http_version_slash:
|
||||||
if (input == '/') {
|
if (input == '/')
|
||||||
|
{
|
||||||
state_ = http_version_major_start;
|
state_ = http_version_major_start;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_major_start:
|
case http_version_major_start:
|
||||||
if (isDigit(input)) {
|
if (isDigit(input))
|
||||||
|
{
|
||||||
state_ = http_version_major;
|
state_ = http_version_major;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_major:
|
case http_version_major:
|
||||||
if (input == '.') {
|
if (input == '.')
|
||||||
|
{
|
||||||
state_ = http_version_minor_start;
|
state_ = http_version_minor_start;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (isDigit(input)) {
|
|
||||||
return boost::indeterminate;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
if (isDigit(input))
|
||||||
|
{
|
||||||
|
return boost::indeterminate;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
case http_version_minor_start:
|
case http_version_minor_start:
|
||||||
if (isDigit(input)) {
|
if (isDigit(input))
|
||||||
|
{
|
||||||
state_ = http_version_minor;
|
state_ = http_version_minor;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case http_version_minor:
|
case http_version_minor:
|
||||||
if (input == '\r') {
|
if (input == '\r')
|
||||||
|
{
|
||||||
state_ = expecting_newline_1;
|
state_ = expecting_newline_1;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (isDigit(input)) {
|
}
|
||||||
|
if (isDigit(input))
|
||||||
|
{
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
}
|
}
|
||||||
else {
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
case expecting_newline_1:
|
case expecting_newline_1:
|
||||||
if (input == '\n') {
|
if (input == '\n')
|
||||||
|
{
|
||||||
state_ = header_line_start;
|
state_ = header_line_start;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case header_line_start:
|
case header_line_start:
|
||||||
if(header.name == "Accept-Encoding") {
|
if(header.name == "Accept-Encoding")
|
||||||
|
{
|
||||||
/* giving gzip precedence over deflate */
|
/* giving gzip precedence over deflate */
|
||||||
if(header.value.find("deflate") != std::string::npos)
|
if (header.value.find("deflate") != std::string::npos)
|
||||||
|
{
|
||||||
*compressionType = deflateRFC1951;
|
*compressionType = deflateRFC1951;
|
||||||
if(header.value.find("gzip") != std::string::npos)
|
}
|
||||||
|
if (header.value.find("gzip") != std::string::npos)
|
||||||
|
{
|
||||||
*compressionType = gzipRFC1952;
|
*compressionType = gzipRFC1952;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if("Referer" == header.name)
|
if ("Referer" == header.name)
|
||||||
|
{
|
||||||
req.referrer = header.value;
|
req.referrer = header.value;
|
||||||
|
}
|
||||||
|
|
||||||
if("User-Agent" == header.name)
|
if ("User-Agent" == header.name)
|
||||||
|
{
|
||||||
req.agent = header.value;
|
req.agent = header.value;
|
||||||
|
}
|
||||||
|
|
||||||
if (input == '\r') {
|
if (input == '\r')
|
||||||
|
{
|
||||||
state_ = expecting_newline_3;
|
state_ = expecting_newline_3;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (!isChar(input) || isCTL(input) || isTSpecial(input)) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
state_ = header_name;
|
|
||||||
header.Clear();
|
|
||||||
header.name.push_back(input);
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
state_ = header_name;
|
||||||
|
header.Clear();
|
||||||
|
header.name.push_back(input);
|
||||||
|
return boost::indeterminate;
|
||||||
case header_lws:
|
case header_lws:
|
||||||
if (input == '\r') {
|
if (input == '\r')
|
||||||
|
{
|
||||||
state_ = expecting_newline_2;
|
state_ = expecting_newline_2;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (input == ' ' || input == '\t') {
|
}
|
||||||
|
if (input == ' ' || input == '\t')
|
||||||
|
{
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
}
|
}
|
||||||
else if (isCTL(input)) {
|
if (isCTL(input)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
|
||||||
state_ = header_value;
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
state_ = header_value;
|
||||||
|
return boost::indeterminate;
|
||||||
case header_name:
|
case header_name:
|
||||||
if (input == ':') {
|
if (input == ':')
|
||||||
|
{
|
||||||
state_ = space_before_header_value;
|
state_ = space_before_header_value;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (!isChar(input) || isCTL(input) || isTSpecial(input)) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
header.name.push_back(input);
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
if (!isChar(input) || isCTL(input) || isTSpecial(input))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
header.name.push_back(input);
|
||||||
|
return boost::indeterminate;
|
||||||
case space_before_header_value:
|
case space_before_header_value:
|
||||||
if (input == ' ') {
|
if (input == ' ')
|
||||||
|
{
|
||||||
state_ = header_value;
|
state_ = header_value;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case header_value:
|
case header_value:
|
||||||
if (input == '\r') {
|
if (input == '\r')
|
||||||
|
{
|
||||||
state_ = expecting_newline_2;
|
state_ = expecting_newline_2;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else if (isCTL(input)) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
header.value.push_back(input);
|
|
||||||
return boost::indeterminate;
|
|
||||||
}
|
}
|
||||||
|
if (isCTL(input))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
header.value.push_back(input);
|
||||||
|
return boost::indeterminate;
|
||||||
case expecting_newline_2:
|
case expecting_newline_2:
|
||||||
if (input == '\n') {
|
if (input == '\n')
|
||||||
|
{
|
||||||
state_ = header_line_start;
|
state_ = header_line_start;
|
||||||
return boost::indeterminate;
|
return boost::indeterminate;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
case expecting_newline_3:
|
case expecting_newline_3:
|
||||||
return (input == '\n');
|
return (input == '\n');
|
||||||
default:
|
default:
|
||||||
@ -244,27 +269,32 @@ boost::tribool RequestParser::consume(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool RequestParser::isChar(int c) {
|
inline bool RequestParser::isChar(int c)
|
||||||
|
{
|
||||||
return c >= 0 && c <= 127;
|
return c >= 0 && c <= 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool RequestParser::isCTL(int c) {
|
inline bool RequestParser::isCTL(int c)
|
||||||
|
{
|
||||||
return (c >= 0 && c <= 31) || (c == 127);
|
return (c >= 0 && c <= 31) || (c == 127);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool RequestParser::isTSpecial(int c) {
|
inline bool RequestParser::isTSpecial(int c)
|
||||||
switch (c) {
|
{
|
||||||
case '(': case ')': case '<': case '>': case '@':
|
switch (c)
|
||||||
case ',': case ';': case ':': case '\\': case '"':
|
{
|
||||||
case '/': case '[': case ']': case '?': case '=':
|
case '(': case ')': case '<': case '>': case '@':
|
||||||
case '{': case '}': case ' ': case '\t':
|
case ',': case ';': case ':': case '\\': case '"':
|
||||||
return true;
|
case '/': case '[': case ']': case '?': case '=':
|
||||||
default:
|
case '{': case '}': case ' ': case '\t':
|
||||||
return false;
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool RequestParser::isDigit(int c) {
|
inline bool RequestParser::isDigit(int c)
|
||||||
|
{
|
||||||
return c >= '0' && c <= '9';
|
return c >= '0' && c <= '9';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user