From 11a5804d3632916fad53a5bd76de171c0b7996ac Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Wed, 22 May 2024 22:42:43 +0200 Subject: [PATCH] wip --- CMakeLists.txt | 2 +- src/server/api/url_parser.cpp | 25 +++++++++++++++---- unit_tests/server/url_parser.cpp | 43 ++++++++++++++++++++------------ 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23bd0bcad..ce55021ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -359,7 +359,7 @@ if(ENABLE_CONAN) KEEP_RPATHS NO_OUTPUT_DIRS OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake - onetbb:shared=${TBB_SHARED} + # onetbb:shared=${TBB_SHARED} boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it BUILD missing ) diff --git a/src/server/api/url_parser.cpp b/src/server/api/url_parser.cpp index 6ef050814..d54490e41 100644 --- a/src/server/api/url_parser.cpp +++ b/src/server/api/url_parser.cpp @@ -6,17 +6,29 @@ #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 { }; @@ -27,14 +39,17 @@ const x3::rule query = "query"; const x3::rule start = "start"; const auto identifier = x3::char_("a-zA-Z0-9_.~:-"); -const auto percent_encoding = x3::char_('%') >> x3::uint_parser(); + +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; +const auto query_def = +(all_chars[percent_decode()]); 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 184092d07..4e7716795 100644 --- a/unit_tests/server/url_parser.cpp +++ b/unit_tests/server/url_parser.cpp @@ -107,29 +107,40 @@ 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(}jmwFz~ubMyCa@`@yDJqE)?你好&\n \"%~", 14UL}; + "match", 1, "car", "polyline ", 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"); + "/match/v1/car/polyline%20"); 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); + 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); + // 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); } BOOST_AUTO_TEST_SUITE_END()