This commit is contained in:
Siarhei Fedartsou 2024-05-22 22:42:43 +02:00
parent 14bdf07464
commit 11a5804d36
3 changed files with 48 additions and 22 deletions

View File

@ -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
)

View File

@ -6,17 +6,29 @@
#include <boost/spirit/home/x3.hpp>
#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
#include <boost/spirit/home/x3/support/utility/annotate_on_success.hpp>
#include <iostream>
#include <string>
#include <sstream>
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 <typename Context>
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<char>(hex_value);
}
};
struct ParsedURLClass : x3::annotate_on_success
{
};
@ -27,14 +39,17 @@ const x3::rule<struct Query, std::string> query = "query";
const x3::rule<struct ParsedURL, ParsedURL> start = "start";
const auto identifier = x3::char_("a-zA-Z0-9_.~:-");
const auto percent_encoding = x3::char_('%') >> x3::uint_parser<unsigned char, 16, 2, 2>();
const auto percent_encoding =
x3::lit('%') >> x3::uint_parser<unsigned char, 16, 2, 2>()[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;

View File

@ -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()