This commit is contained in:
Siarhei Fedartsou 2024-05-23 19:56:27 +02:00
parent 11a5804d36
commit c8d03e4c3b
2 changed files with 32 additions and 46 deletions

View File

@ -7,28 +7,17 @@
#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>
#include <string>
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
{
};
@ -40,16 +29,15 @@ const x3::rule<struct ParsedURL, ParsedURL> start = "start";
const auto identifier = x3::char_("a-zA-Z0-9_.~:-");
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[percent_decode()]);
const auto percent_encoding = x3::lit('%') >> x3::uint_parser<unsigned char, 16, 2, 2>();
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;

View File

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