From c8d03e4c3b71ca59ae25f2aea0d00c8ef1b6287a Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Thu, 23 May 2024 19:56:27 +0200 Subject: [PATCH] wip --- src/server/api/url_parser.cpp | 30 ++++++-------------- unit_tests/server/url_parser.cpp | 48 +++++++++++++++----------------- 2 files changed, 32 insertions(+), 46 deletions(-) diff --git a/src/server/api/url_parser.cpp b/src/server/api/url_parser.cpp index d54490e41..526281909 100644 --- a/src/server/api/url_parser.cpp +++ b/src/server/api/url_parser.cpp @@ -7,28 +7,17 @@ #include #include #include -#include #include +#include BOOST_FUSION_ADAPT_STRUCT(osrm::server::api::ParsedURL, - (std::string, service)(unsigned, version)(std::string, profile)(std::string, query)) + (std::string, service)(unsigned, version)(std::string, + profile)(std::string, query)) namespace osrm::server::api { namespace x3 = boost::spirit::x3; -struct percent_decode -{ - template - void operator()(Context const &ctx) const - { - unsigned hex_str = x3::_attr(ctx); - std::cerr << hex_str << std::endl; - // unsigned char hex_value = std::stoul(hex_str, nullptr, 16); - // x3::_val(ctx) += static_cast(hex_value); - } -}; - struct ParsedURLClass : x3::annotate_on_success { }; @@ -40,16 +29,15 @@ const x3::rule start = "start"; const auto identifier = x3::char_("a-zA-Z0-9_.~:-"); -const auto percent_encoding = - x3::lit('%') >> x3::uint_parser()[percent_decode()]; - -const auto polyline_chars = x3::char_("a-zA-Z0-9_[]{}@?|\\~`^") | percent_encoding; -const auto all_chars = polyline_chars | x3::char_("=,;:&().-"); - const auto service_def = +identifier; const auto version_def = x3::uint_; const auto profile_def = +identifier; -const auto query_def = +(all_chars[percent_decode()]); + +const auto percent_encoding = x3::lit('%') >> x3::uint_parser(); + +const auto query_char = percent_encoding | x3::char_("a-zA-Z0-9_[]{}@?|\\~`^=,;:&().-"); + +const auto query_def = +query_char; const auto start_def = x3::lit('/') > service > x3::lit('/') > x3::lit('v') > version > x3::lit('/') > profile > x3::lit('/') > query; diff --git a/unit_tests/server/url_parser.cpp b/unit_tests/server/url_parser.cpp index 4e7716795..94fc1fe24 100644 --- a/unit_tests/server/url_parser.cpp +++ b/unit_tests/server/url_parser.cpp @@ -107,40 +107,38 @@ BOOST_AUTO_TEST_CASE(valid_urls) CHECK_EQUAL_RANGE(reference_7.query, result_7->query); BOOST_CHECK_EQUAL(reference_7.prefix_length, result_7->prefix_length); + // polyline with %HEX api::ParsedURL reference_8{ - "match", 1, "car", "polyline ", 14UL}; + "match", 1, "car", "polyline(}jmwFz~ubMyCa@`@yDJqE)?你好&\n \"%~", 14UL}; auto result_8 = api::parseURL( - "/match/v1/car/polyline%20"); + "/match/v1/car/polyline(%7DjmwFz~ubMyCa@%60@yDJqE)?%e4%bd%a0%e5%a5%bd&%0A%20%22%25%7e"); BOOST_CHECK(result_8); BOOST_CHECK_EQUAL(reference_8.service, result_8->service); BOOST_CHECK_EQUAL(reference_8.version, result_8->version); BOOST_CHECK_EQUAL(reference_8.profile, result_8->profile); CHECK_EQUAL_RANGE(reference_8.query, result_8->query); - // BOOST_CHECK_EQUAL(reference_8.prefix_length, result_8->prefix_length); + BOOST_CHECK_EQUAL(reference_8.prefix_length, result_8->prefix_length); - // polyline with %HEX - // api::ParsedURL reference_8{ - // "match", 1, "car", "polyline(}jmwFz~ubMyCa@`@yDJqE)?你好&\n \"%~", 14UL}; - // auto result_8 = api::parseURL( - // "/match/v1/car/polyline(%7DjmwFz~ubMyCa@%60@yDJqE)?%e4%bd%a0%e5%a5%bd&%0A%20%22%25%7e"); - // BOOST_CHECK(result_8); - // BOOST_CHECK_EQUAL(reference_8.service, result_8->service); - // BOOST_CHECK_EQUAL(reference_8.version, result_8->version); - // BOOST_CHECK_EQUAL(reference_8.profile, result_8->profile); - // CHECK_EQUAL_RANGE(reference_8.query, result_8->query); - // BOOST_CHECK_EQUAL(reference_8.prefix_length, result_8->prefix_length); + // profile with special characters + api::ParsedURL reference_9{ + "route", 1, "foo-bar_baz.profile", "0,1;2,3;4,5?options=value&foo=bar", 30UL}; + auto result_9 = + api::parseURL("/route/v1/foo-bar_baz.profile/0,1;2,3;4,5?options=value&foo=bar"); + BOOST_CHECK(result_9); + BOOST_CHECK_EQUAL(reference_9.service, result_9->service); + BOOST_CHECK_EQUAL(reference_9.version, result_9->version); + BOOST_CHECK_EQUAL(reference_9.profile, result_9->profile); + CHECK_EQUAL_RANGE(reference_9.query, result_9->query); + BOOST_CHECK_EQUAL(reference_9.prefix_length, result_9->prefix_length); - // // profile with special characters - // api::ParsedURL reference_9{ - // "route", 1, "foo-bar_baz.profile", "0,1;2,3;4,5?options=value&foo=bar", 30UL}; - // auto result_9 = - // api::parseURL("/route/v1/foo-bar_baz.profile/0,1;2,3;4,5?options=value&foo=bar"); - // BOOST_CHECK(result_9); - // BOOST_CHECK_EQUAL(reference_9.service, result_9->service); - // BOOST_CHECK_EQUAL(reference_9.version, result_9->version); - // BOOST_CHECK_EQUAL(reference_9.profile, result_9->profile); - // CHECK_EQUAL_RANGE(reference_9.query, result_9->query); - // BOOST_CHECK_EQUAL(reference_9.prefix_length, result_9->prefix_length); + api::ParsedURL reference_10{"match", 1, "car", "poly line ", 14UL}; + auto result_10 = api::parseURL("/match/v1/car/poly%20line%20"); + BOOST_CHECK(result_10); + BOOST_CHECK_EQUAL(reference_10.service, result_10->service); + BOOST_CHECK_EQUAL(reference_10.version, result_10->version); + BOOST_CHECK_EQUAL(reference_10.profile, result_10->profile); + CHECK_EQUAL_RANGE(reference_10.query, result_10->query); + BOOST_CHECK_EQUAL(reference_10.prefix_length, result_10->prefix_length); } BOOST_AUTO_TEST_SUITE_END()