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()
: 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;
if(is_post_header && (begin == end))
{
result = osrm::tribool::yes;
}
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;
}
if(input == 'P')
{
state = internal_state::post_O;
return osrm::tribool::indeterminate;
}
state = internal_state::method;
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:
if (input == ' ')
{
@ -272,7 +307,18 @@ osrm::tribool RequestParser::consume(request &current_request, const char input)
return osrm::tribool::indeterminate;
}
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;
}
}

View File

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