diff --git a/Duplicati/Library/Utility/Uri.cs b/Duplicati/Library/Utility/Uri.cs index 19be6be5b..71dbe8671 100644 --- a/Duplicati/Library/Utility/Uri.cs +++ b/Duplicati/Library/Utility/Uri.cs @@ -34,7 +34,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 8997ec934..df8a330fe 100644 --- a/Duplicati/UnitTest/UriUtilityTests.cs +++ b/Duplicati/UnitTest/UriUtilityTests.cs @@ -17,11 +17,11 @@ using NUnit.Framework; using System.Collections.Specialized; - -namespace Duplicati.UnitTest -{ - public class UriUtilityTests - { + +namespace Duplicati.UnitTest +{ + public class UriUtilityTests + { [Test] [Category("UriUtility")] public static void TestBuildUriQuery() @@ -65,5 +65,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); + } + } + } + } +}