From 6a08d93e2c9993b87fc43c1bc2d7ea19f845fab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Gru=C3=9F?= Date: Wed, 27 May 2015 15:40:10 +0200 Subject: [PATCH] http post requests implemented --- server/request_parser.cpp | 50 +++++++++++++++++++++++++++++++++++++-- server/request_parser.hpp | 7 +++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/server/request_parser.cpp b/server/request_parser.cpp index 584dcbeeb..d57dd305b 100644 --- a/server/request_parser.cpp +++ b/server/request_parser.cpp @@ -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 ¤t_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 ¤t_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 ¤t_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; } } diff --git a/server/request_parser.hpp b/server/request_parser.hpp index 2b6bf6944..86b08c4cc 100644 --- a/server/request_parser.hpp +++ b/server/request_parser.hpp @@ -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