http post requests implemented

This commit is contained in:
Andreas Gruß 2015-05-27 15:40:10 +02:00
parent 2cd616dd30
commit 6a08d93e2c
2 changed files with 54 additions and 3 deletions

View File

@ -42,7 +42,7 @@ namespace http
RequestParser::RequestParser() RequestParser::RequestParser()
: state(internal_state::method_start), current_header({"", ""}), : state(internal_state::method_start), current_header({"", ""}),
selected_compression(no_compression) selected_compression(no_compression), is_post_header(false)
{ {
} }
@ -58,6 +58,11 @@ RequestParser::parse(request &current_request, char *begin, char *end)
} }
} }
osrm::tribool result = osrm::tribool::indeterminate; osrm::tribool result = osrm::tribool::indeterminate;
if(is_post_header && (begin == end))
{
result = osrm::tribool::yes;
}
return std::make_tuple(result, selected_compression); return std::make_tuple(result, selected_compression);
} }
@ -70,8 +75,38 @@ osrm::tribool RequestParser::consume(request &current_request, const char input)
{ {
return osrm::tribool::no; return osrm::tribool::no;
} }
if(input == 'P')
{
state = internal_state::post_O;
return osrm::tribool::indeterminate;
}
state = internal_state::method; state = internal_state::method;
return osrm::tribool::indeterminate; return osrm::tribool::indeterminate;
case internal_state::post_O:
if(input == 'O')
{
state = internal_state::post_S;
return osrm::tribool::indeterminate;
}
return osrm::tribool::no;
case internal_state::post_S:
if(input == 'S')
{
state = internal_state::post_T;
return osrm::tribool::indeterminate;
}
return osrm::tribool::no;
case internal_state::post_T:
if(input == 'T')
{
is_post_header = true;
state = internal_state::method;
return osrm::tribool::indeterminate;
}
return osrm::tribool::no;
case internal_state::post_request:
current_request.uri.push_back(input);
return osrm::tribool::indeterminate;
case internal_state::method: case internal_state::method:
if (input == ' ') if (input == ' ')
{ {
@ -272,7 +307,18 @@ osrm::tribool RequestParser::consume(request &current_request, const char input)
return osrm::tribool::indeterminate; return osrm::tribool::indeterminate;
} }
return osrm::tribool::no; return osrm::tribool::no;
default: // expecting_newline_3 case internal_state::expecting_newline_3:
if(input == '\n')
{
if(is_post_header)
{
state = internal_state::post_request;
return osrm::tribool::indeterminate;
}
return osrm::tribool::yes;
}
return osrm::tribool::no;
default: // should never be reached
return input == '\n' ? osrm::tribool::yes : osrm::tribool::no; return input == '\n' ? osrm::tribool::yes : osrm::tribool::no;
} }
} }

View File

@ -80,11 +80,16 @@ class RequestParser
space_before_header_value, space_before_header_value,
header_value, header_value,
expecting_newline_2, expecting_newline_2,
expecting_newline_3 expecting_newline_3,
post_O,
post_S,
post_T,
post_request
} state; } state;
header current_header; header current_header;
compression_type selected_compression; compression_type selected_compression;
bool is_post_header;
}; };
} // namespace http } // namespace http