From c183ec816c2cf2425acf9a0d8c5727592f3a54d3 Mon Sep 17 00:00:00 2001 From: Caelan Sayler Date: Sat, 4 Nov 2023 13:55:46 +0000 Subject: [PATCH] SimpleWebSource now preserves query parameters (closes #141) --- src/Squirrel/Sources/SimpleWebSource.cs | 6 +++-- test/CheckForUpdateTests.cs | 31 +++++++++++++++++++++++++ test/Squirrel.Tests.csproj | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Squirrel/Sources/SimpleWebSource.cs b/src/Squirrel/Sources/SimpleWebSource.cs index 19c653ab2..be23ffbe2 100644 --- a/src/Squirrel/Sources/SimpleWebSource.cs +++ b/src/Squirrel/Sources/SimpleWebSource.cs @@ -66,7 +66,6 @@ public virtual Task DownloadReleaseEntry(ReleaseEntry releaseEntry, string local if (releaseEntry == null) throw new ArgumentNullException(nameof(releaseEntry)); if (localFile == null) throw new ArgumentNullException(nameof(localFile)); - var releaseUri = releaseEntry.BaseUrl == null ? releaseEntry.Filename : Utility.AppendPathToUri(new Uri(releaseEntry.BaseUrl), releaseEntry.Filename).ToString(); @@ -78,7 +77,10 @@ public virtual Task DownloadReleaseEntry(ReleaseEntry releaseEntry, string local // releaseUri can be a relative url (eg. "MyPackage.nupkg") or it can be an // absolute url (eg. "https://example.com/MyPackage.nupkg"). In the former case var sourceBaseUri = Utility.EnsureTrailingSlash(BaseUri); - var source = new Uri(sourceBaseUri, releaseUri).ToString(); + + var source = Utility.IsHttpUrl(releaseUri) + ? new Uri(sourceBaseUri, releaseUri).ToString() + : Utility.AppendPathToUri(sourceBaseUri, releaseUri).ToString(); this.Log().Info($"Downloading '{releaseEntry.Filename}' from '{source}'."); return Downloader.DownloadFile(source, localFile, progress); diff --git a/test/CheckForUpdateTests.cs b/test/CheckForUpdateTests.cs index 0e7d103ee..8b5c52e0b 100644 --- a/test/CheckForUpdateTests.cs +++ b/test/CheckForUpdateTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Web; using Squirrel.Tests.TestHelpers; using Xunit; @@ -143,5 +144,35 @@ public async Task WebSourceRequestsExpectedUrls(string releaseEntry, string rele await source.DownloadReleaseEntry(releases[0], "test", null); Assert.Equal(baseUrl + "/" + releases[0].Filename, new Uri(dl.LastUrl).GetLeftPart(UriPartial.Path)); } + + [Theory] + [InlineData("http://example.com", "MyPackage.nupkg", "http://example.com/MyPackage.nupkg")] + [InlineData("http://example.com?auth=hello", "MyPackage.nupkg", "http://example.com/MyPackage.nupkg?auth=hello")] + [InlineData("http://example.com?auth=hello", "https://my.packages.domain/MyPackage-1.0.0.nupkg", "https://my.packages.domain/MyPackage-1.0.0.nupkg")] + public async Task SimpleWebSourcePreservesQueryParametersAndAbsoluteReleaseUri(string baseUri, string releaseUri, string expectedPackageUrl) + { + var dl = new FakeDownloader(); + var source = new Sources.SimpleWebSource(baseUri, dl); + var baseKvp = HttpUtility.ParseQueryString(new Uri(baseUri).Query); + var baseDict = baseKvp.AllKeys.Where(k => k != null).ToDictionary(k => k, k => baseKvp[k]); + + var releaseEntry = $"94689fede03fed7ab59c24337673a27837f0c3ec {releaseUri} 1004502"; + dl.MockedResponseBytes = Encoding.UTF8.GetBytes(releaseEntry); + + var releases = await source.GetReleaseFeed(); + var expected = new Uri(baseUri).GetLeftPart(UriPartial.Path).TrimEnd('/') + "/RELEASES"; + Assert.StartsWith(expected, dl.LastUrl); + + // check that each query parameter in base url is in the releases string + var releasesUri = new Uri(dl.LastUrl); + var releasesKvp = HttpUtility.ParseQueryString(releasesUri.Query); + var releasesDict = releasesKvp.AllKeys.Where(k => k != null).ToDictionary(k => k, k => releasesKvp[k]); + foreach (var kvp in baseDict) { + Assert.Equal(releasesDict[kvp.Key], kvp.Value); + } + + await source.DownloadReleaseEntry(releases[0], "test", null); + Assert.Equal(expectedPackageUrl, dl.LastUrl); + } } } diff --git a/test/Squirrel.Tests.csproj b/test/Squirrel.Tests.csproj index 6e9252a2f..365d40216 100644 --- a/test/Squirrel.Tests.csproj +++ b/test/Squirrel.Tests.csproj @@ -32,6 +32,7 @@ +