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); + } + } + } } }