diff options
author | Richard Walters <rwalters@digitalstirling.com> | 2018-07-01 15:08:21 -0700 |
---|---|---|
committer | Richard Walters <rwalters@digitalstirling.com> | 2018-07-01 15:08:21 -0700 |
commit | b4cc26f831573d8dc122b4d2ba8a5f5d8d7e3773 (patch) | |
tree | 50f9b76f472908663529a1ba38b01fd51193a191 | |
parent | 9f9ee6af4299dbc95f5d7b814679714ba0ab5051 (diff) |
Fix second bug in scheme delimiter searching
Path may also have colon, so make sure we don't scan
into the path element if there is one.
-rw-r--r-- | src/Uri.cpp | 12 | ||||
-rw-r--r-- | test/src/UriTests.cpp | 3 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/Uri.cpp b/src/Uri.cpp index ba04298..38dbe50 100644 --- a/src/Uri.cpp +++ b/src/Uri.cpp @@ -466,11 +466,15 @@ namespace Uri { bool Uri::ParseFromString(const std::string& uriString) { // First parse the scheme. - auto authorityDelimiter = uriString.find("//"); - if (authorityDelimiter == std::string::npos) { - authorityDelimiter = uriString.length(); + // Limit our search so we don't scan into the authority + // or path elements, because these may have the colon + // character as well, which we might misinterpret + // as the scheme delimiter. + auto authorityOrPathDelimiterStart = uriString.find('/'); + if (authorityOrPathDelimiterStart == std::string::npos) { + authorityOrPathDelimiterStart = uriString.length(); } - const auto schemeEnd = uriString.substr(0, authorityDelimiter).find(':'); + const auto schemeEnd = uriString.substr(0, authorityOrPathDelimiterStart).find(':'); std::string rest; if (schemeEnd == std::string::npos) { impl_->scheme.clear(); diff --git a/test/src/UriTests.cpp b/test/src/UriTests.cpp index d7ada25..4c1f307 100644 --- a/test/src/UriTests.cpp +++ b/test/src/UriTests.cpp @@ -349,13 +349,14 @@ TEST(UriTests, ParseFromStringHostBarelyLegal) { } } -TEST(UriTests, ParseFromStringDontMisinterpretColonInAuthorityAsSchemeDelimiter) { +TEST(UriTests, ParseFromStringDontMisinterpretColonInOtherPlacesAsSchemeDelimiter) { const std::vector< std::string > testVectors{ {"//foo:bar@www.example.com/"}, {"//www.example.com/a:b"}, {"//www.example.com/foo?a:b"}, {"//www.example.com/foo#a:b"}, {"//[v7.:]/"}, + {"/:/foo"}, }; size_t index = 0; for (const auto& testVector : testVectors) { |