From 8930a32c2072113860fb097ae68f4f3c7e687354 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk Date: Wed, 22 Nov 2023 09:27:03 +0200 Subject: [PATCH] [coding] UrlDecode the plus sign '+' as a space `123+Main+St,+Seattle,+WA+98101` is equvivalent to `123%20Main%20St,%20Seattle,%20WA+98101` and should be decoded as `123 Main St, Seattle, WA 98101`. Signed-off-by: Roman Tsisyk --- coding/coding_tests/url_tests.cpp | 1 + coding/url.cpp | 4 ++++ map/map_tests/mwm_url_tests.cpp | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/coding/coding_tests/url_tests.cpp b/coding/coding_tests/url_tests.cpp index 6d20ec5a04..733aaa4f24 100644 --- a/coding/coding_tests/url_tests.cpp +++ b/coding/coding_tests/url_tests.cpp @@ -97,6 +97,7 @@ UNIT_TEST(Url_Decode) TEST_EQUAL(UrlDecode(enc2), orig2, ()); TEST_EQUAL(UrlDecode(enc3), orig3, ()); TEST_EQUAL(UrlDecode(enc4), orig4, ()); + TEST_EQUAL(UrlDecode("123+Main+St,+Seattle,+WA+98101"), "123 Main St, Seattle, WA 98101", ()); } UNIT_TEST(Url_Invalid) diff --git a/coding/url.cpp b/coding/url.cpp index 514505c561..1ccffc39bc 100644 --- a/coding/url.cpp +++ b/coding/url.cpp @@ -174,6 +174,10 @@ string UrlDecode(string_view encodedUrl) result += FromHex(encodedUrl.substr(i + 1, 2)); i += 2; } + else if (encodedUrl[i] == '+') + { + result += ' '; + } else { result += encodedUrl[i]; diff --git a/map/map_tests/mwm_url_tests.cpp b/map/map_tests/mwm_url_tests.cpp index 2c2e382a6b..6c0e0f1454 100644 --- a/map/map_tests/mwm_url_tests.cpp +++ b/map/map_tests/mwm_url_tests.cpp @@ -355,6 +355,14 @@ UNIT_TEST(SearchApiGeoScheme) TEST_ALMOST_EQUAL_ABS(latlon.m_lat, 35.3381607, kEps, ()); TEST_ALMOST_EQUAL_ABS(latlon.m_lon, 33.3290564, kEps, ()); } + { + ParsedMapApi api("geo:0,0?q=123+Main+St,+Seattle,+WA+98101"); + TEST_EQUAL(api.GetRequestType(), UrlType::Search, ()); + auto const & request = api.GetSearchRequest(); + ms::LatLon latlon = api.GetCenterLatLon(); + TEST(!latlon.IsValid(), ()); + TEST_EQUAL(request.m_query, "123 Main St, Seattle, WA 98101", ()); + } } UNIT_TEST(CrosshairApi)