From b4cc26f831573d8dc122b4d2ba8a5f5d8d7e3773 Mon Sep 17 00:00:00 2001
From: Richard Walters <rwalters@digitalstirling.com>
Date: Sun, 1 Jul 2018 15:08:21 -0700
Subject: 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.
---
 src/Uri.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

(limited to 'src')

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();
-- 
cgit v1.2.3