diff --git a/Duplicati/Library/Utility/Uri.cs b/Duplicati/Library/Utility/Uri.cs
index 53685b2ce..c05ecaab8 100644
--- a/Duplicati/Library/Utility/Uri.cs
+++ b/Duplicati/Library/Utility/Uri.cs
@@ -38,7 +38,7 @@ namespace Duplicati.Library.Utility
///
/// A very lax version of a URL parser
///
- private static readonly System.Text.RegularExpressions.Regex URL_PARSER = new System.Text.RegularExpressions.Regex(@"(?[^:]+)://(((?[^\:\?/]+)(\:(?[^@\:\?/]*))?\@))?((?[^/\?\:]+)(\:(?\d+))?)?((?[^\?]*))?(\?(?.+))?");
+ private static readonly System.Text.RegularExpressions.Regex URL_PARSER = new System.Text.RegularExpressions.Regex(@"(?[^:]+)://(((?[^\:\?/]+)(\:(?[^@\:\?/]*))?\@))?((?(?:[^\[/\?\:][^/\?\:]*)|(?:\[[^\]]+\]))(\:(?\d+))?)?((?[^\?]*))?(\?(?.+))?");
///
/// The URL scheme, e.g. http
diff --git a/Duplicati/UnitTest/UriUtilityTests.cs b/Duplicati/UnitTest/UriUtilityTests.cs
index 1742eeb15..3e523bf76 100644
--- a/Duplicati/UnitTest/UriUtilityTests.cs
+++ b/Duplicati/UnitTest/UriUtilityTests.cs
@@ -69,5 +69,48 @@ namespace Duplicati.UnitTest
Assert.AreEqual("/a", Library.Utility.UrlPath.Create(path1).Append(null).ToString());
Assert.AreEqual("/b/", Library.Utility.UrlPath.Create(string.Empty).Append(path2).ToString());
}
+
+ [Test]
+ [Category("UriUtility")]
+ public static void TestUriParse(
+ [Values("[1:2:3::4]", "127.0.0.1", "hostname")] string host,
+ [Values("", "user@", "user:pw@")] string user,
+ [Values("", ":80")] string port,
+ [Values("", "/path")] string path,
+ [Values("", "?query")] string query)
+ {
+ string uriStr = $"http://{user}{host}{port}{path}{query}";
+
+ var uri = new Library.Utility.Uri(uriStr);
+ Assert.AreEqual("http", uri.Scheme);
+ Assert.AreEqual(host, uri.Host);
+ if (port.Length != 0)
+ {
+ Assert.AreEqual(80, uri.Port);
+ }
+ else
+ {
+ Assert.AreEqual(-1, uri.Port);
+ }
+ Assert.AreEqual(path.TrimStart('/'), uri.Path);
+ Assert.AreEqual(query.Length == 0 ? null : query.TrimStart('?'), uri.Query);
+ if (user.Length == 0)
+ {
+ Assert.IsNull(uri.Username);
+ Assert.IsNull(uri.Password);
+ }
+ else
+ {
+ Assert.AreEqual("user", uri.Username);
+ if (user.Contains(":"))
+ {
+ Assert.AreEqual("pw", uri.Password);
+ }
+ else
+ {
+ Assert.IsNull(uri.Password);
+ }
+ }
+ }
}
}