(content, _jsonOptions);
+ if (data is null) throw new JsonException("Deserialized response is null");
+ return data;
+ }
+ catch (CoderApiHttpException)
+ {
+ throw;
+ }
+ catch (Exception e)
+ {
+ throw new Exception($"API Request failed: {method} {path}", e);
+ }
+ }
+}
diff --git a/Installer/Installer.csproj b/Installer/Installer.csproj
index b850f6a..99261b9 100644
--- a/Installer/Installer.csproj
+++ b/Installer/Installer.csproj
@@ -17,6 +17,7 @@
+
diff --git a/Installer/Program.cs b/Installer/Program.cs
index 78965e4..10a09a7 100644
--- a/Installer/Program.cs
+++ b/Installer/Program.cs
@@ -128,7 +128,8 @@ public class BootstrapperOptions : SharedOptions
if (!SystemFile.Exists(MsiPath))
throw new ArgumentException($"MSI package not found at '{MsiPath}'", nameof(MsiPath));
if (!SystemFile.Exists(WindowsAppSdkPath))
- throw new ArgumentException($"Windows App Sdk package not found at '{WindowsAppSdkPath}'", nameof(WindowsAppSdkPath));
+ throw new ArgumentException($"Windows App Sdk package not found at '{WindowsAppSdkPath}'",
+ nameof(WindowsAppSdkPath));
}
}
@@ -138,6 +139,8 @@ public class Program
private const string Manufacturer = "Coder Technologies Inc.";
private const string HelpUrl = "https://coder.com/docs";
private const string RegistryKey = @"SOFTWARE\Coder Desktop";
+ private const string AppConfigRegistryKey = RegistryKey + @"\App";
+ private const string VpnServiceConfigRegistryKey = RegistryKey + @"\VpnService";
private const string DotNetCheckName = "DOTNET_RUNTIME_CHECK";
private const RollForward DotNetCheckRollForward = RollForward.minor;
@@ -258,18 +261,21 @@ private static int BuildMsiPackage(MsiOptions opts)
project.AddRegValues(
// Add registry values that are consumed by the manager. Note that these
- // should not be changed. See Vpn.Service/Program.cs and
+ // should not be changed. See Vpn.Service/Program.cs (AddDefaultConfig) and
// Vpn.Service/ManagerConfig.cs for more details.
- new RegValue(RegistryHive, RegistryKey, "Manager:ServiceRpcPipeName", "Coder.Desktop.Vpn"),
- new RegValue(RegistryHive, RegistryKey, "Manager:TunnelBinaryPath",
+ new RegValue(RegistryHive, VpnServiceConfigRegistryKey, "Manager:ServiceRpcPipeName", "Coder.Desktop.Vpn"),
+ new RegValue(RegistryHive, VpnServiceConfigRegistryKey, "Manager:TunnelBinaryPath",
$"[INSTALLFOLDER]{opts.VpnDir}\\coder-vpn.exe"),
- new RegValue(RegistryHive, RegistryKey, "Manager:LogFileLocation",
+ new RegValue(RegistryHive, VpnServiceConfigRegistryKey, "Manager:TunnelBinarySignatureSigner",
+ "Coder Technologies Inc."),
+ new RegValue(RegistryHive, VpnServiceConfigRegistryKey, "Manager:TunnelBinaryAllowVersionMismatch",
+ "false"),
+ new RegValue(RegistryHive, VpnServiceConfigRegistryKey, "Serilog:WriteTo:0:Args:path",
@"[INSTALLFOLDER]coder-desktop-service.log"),
- new RegValue(RegistryHive, RegistryKey, "Manager:TunnelBinarySignatureSigner", "Coder Technologies Inc."),
- new RegValue(RegistryHive, RegistryKey, "Manager:TunnelBinaryAllowVersionMismatch", "false"),
+
// Add registry values that are consumed by the App MutagenController. See App/Services/MutagenController.cs
- new RegValue(RegistryHive, RegistryKey, "AppMutagenController:MutagenExecutablePath",
- @"[INSTALLFOLDER]mutagen.exe")
+ new RegValue(RegistryHive, AppConfigRegistryKey, "MutagenController:MutagenExecutablePath",
+ @"[INSTALLFOLDER]vpn\mutagen.exe")
);
// Note: most of this control panel info will not be visible as this
@@ -381,8 +387,8 @@ private static int BuildBundle(BootstrapperOptions opts)
[
new ExePackagePayload
{
- SourceFile = opts.WindowsAppSdkPath
- }
+ SourceFile = opts.WindowsAppSdkPath,
+ },
],
},
new MsiPackage(opts.MsiPath)
diff --git a/MutagenSdk/Proto/filesystem/behavior/probe_mode.proto b/MutagenSdk/Proto/filesystem/behavior/probe_mode.proto
index ecbaf4a..2adcd38 100644
--- a/MutagenSdk/Proto/filesystem/behavior/probe_mode.proto
+++ b/MutagenSdk/Proto/filesystem/behavior/probe_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/filesystem/behavior/probe_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/filesystem/behavior/probe_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/selection/selection.proto b/MutagenSdk/Proto/selection/selection.proto
index 55cddb1..0f12504 100644
--- a/MutagenSdk/Proto/selection/selection.proto
+++ b/MutagenSdk/Proto/selection/selection.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/selection/selection.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/selection/selection.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/service/daemon/daemon.proto b/MutagenSdk/Proto/service/daemon/daemon.proto
index f810b3e..b1e836a 100644
--- a/MutagenSdk/Proto/service/daemon/daemon.proto
+++ b/MutagenSdk/Proto/service/daemon/daemon.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/service/daemon/daemon.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/service/daemon/daemon.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/service/prompting/prompting.proto b/MutagenSdk/Proto/service/prompting/prompting.proto
index 19ea8bb..73432b9 100644
--- a/MutagenSdk/Proto/service/prompting/prompting.proto
+++ b/MutagenSdk/Proto/service/prompting/prompting.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/service/prompting/prompting.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/service/prompting/prompting.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/service/synchronization/synchronization.proto b/MutagenSdk/Proto/service/synchronization/synchronization.proto
index 1e3d6b2..798a234 100644
--- a/MutagenSdk/Proto/service/synchronization/synchronization.proto
+++ b/MutagenSdk/Proto/service/synchronization/synchronization.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/service/synchronization/synchronization.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/service/synchronization/synchronization.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/compression/algorithm.proto b/MutagenSdk/Proto/synchronization/compression/algorithm.proto
index 96f972c..e08d1e2 100644
--- a/MutagenSdk/Proto/synchronization/compression/algorithm.proto
+++ b/MutagenSdk/Proto/synchronization/compression/algorithm.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/compression/algorithm.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/compression/algorithm.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/configuration.proto b/MutagenSdk/Proto/synchronization/configuration.proto
index 3ba7fdc..8906377 100644
--- a/MutagenSdk/Proto/synchronization/configuration.proto
+++ b/MutagenSdk/Proto/synchronization/configuration.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/configuration.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/configuration.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/change.proto b/MutagenSdk/Proto/synchronization/core/change.proto
index 3779a25..02ce07c 100644
--- a/MutagenSdk/Proto/synchronization/core/change.proto
+++ b/MutagenSdk/Proto/synchronization/core/change.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/change.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/change.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/conflict.proto b/MutagenSdk/Proto/synchronization/core/conflict.proto
index ea46bef..ea0cf4e 100644
--- a/MutagenSdk/Proto/synchronization/core/conflict.proto
+++ b/MutagenSdk/Proto/synchronization/core/conflict.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/conflict.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/conflict.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/entry.proto b/MutagenSdk/Proto/synchronization/core/entry.proto
index 3b937a3..465396e 100644
--- a/MutagenSdk/Proto/synchronization/core/entry.proto
+++ b/MutagenSdk/Proto/synchronization/core/entry.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/entry.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/entry.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/ignore/ignore_vcs_mode.proto b/MutagenSdk/Proto/synchronization/core/ignore/ignore_vcs_mode.proto
index 9a347c8..bc3fdfb 100644
--- a/MutagenSdk/Proto/synchronization/core/ignore/ignore_vcs_mode.proto
+++ b/MutagenSdk/Proto/synchronization/core/ignore/ignore_vcs_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/ignore/ignore_vcs_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/ignore/ignore_vcs_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/ignore/syntax.proto b/MutagenSdk/Proto/synchronization/core/ignore/syntax.proto
index 7db94d9..d7ba811 100644
--- a/MutagenSdk/Proto/synchronization/core/ignore/syntax.proto
+++ b/MutagenSdk/Proto/synchronization/core/ignore/syntax.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/ignore/syntax.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/ignore/syntax.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/mode.proto b/MutagenSdk/Proto/synchronization/core/mode.proto
index 56fbea9..2a7fffb 100644
--- a/MutagenSdk/Proto/synchronization/core/mode.proto
+++ b/MutagenSdk/Proto/synchronization/core/mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/permissions_mode.proto b/MutagenSdk/Proto/synchronization/core/permissions_mode.proto
index e16648f..2287fc7 100644
--- a/MutagenSdk/Proto/synchronization/core/permissions_mode.proto
+++ b/MutagenSdk/Proto/synchronization/core/permissions_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/permissions_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/permissions_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/problem.proto b/MutagenSdk/Proto/synchronization/core/problem.proto
index d58dec1..a69470d 100644
--- a/MutagenSdk/Proto/synchronization/core/problem.proto
+++ b/MutagenSdk/Proto/synchronization/core/problem.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/problem.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/problem.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/core/symbolic_link_mode.proto b/MutagenSdk/Proto/synchronization/core/symbolic_link_mode.proto
index 31bee64..b7e623d 100644
--- a/MutagenSdk/Proto/synchronization/core/symbolic_link_mode.proto
+++ b/MutagenSdk/Proto/synchronization/core/symbolic_link_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/core/symbolic_link_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/core/symbolic_link_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/hashing/algorithm.proto b/MutagenSdk/Proto/synchronization/hashing/algorithm.proto
index 1cb2fa1..5b1983c 100644
--- a/MutagenSdk/Proto/synchronization/hashing/algorithm.proto
+++ b/MutagenSdk/Proto/synchronization/hashing/algorithm.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/hashing/algorithm.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/hashing/algorithm.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/rsync/receive.proto b/MutagenSdk/Proto/synchronization/rsync/receive.proto
index 7d6b3f2..1c14879 100644
--- a/MutagenSdk/Proto/synchronization/rsync/receive.proto
+++ b/MutagenSdk/Proto/synchronization/rsync/receive.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/rsync/receive.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/rsync/receive.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/scan_mode.proto b/MutagenSdk/Proto/synchronization/scan_mode.proto
index de1777f..4a612b3 100644
--- a/MutagenSdk/Proto/synchronization/scan_mode.proto
+++ b/MutagenSdk/Proto/synchronization/scan_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/scan_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/scan_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/session.proto b/MutagenSdk/Proto/synchronization/session.proto
index c23985f..04b177e 100644
--- a/MutagenSdk/Proto/synchronization/session.proto
+++ b/MutagenSdk/Proto/synchronization/session.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/session.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/session.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/stage_mode.proto b/MutagenSdk/Proto/synchronization/stage_mode.proto
index 247e0a9..9da274e 100644
--- a/MutagenSdk/Proto/synchronization/stage_mode.proto
+++ b/MutagenSdk/Proto/synchronization/stage_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/stage_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/stage_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/state.proto b/MutagenSdk/Proto/synchronization/state.proto
index 24d7e3f..fc62518 100644
--- a/MutagenSdk/Proto/synchronization/state.proto
+++ b/MutagenSdk/Proto/synchronization/state.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/state.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/state.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/version.proto b/MutagenSdk/Proto/synchronization/version.proto
index 92a8c62..08743c4 100644
--- a/MutagenSdk/Proto/synchronization/version.proto
+++ b/MutagenSdk/Proto/synchronization/version.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/version.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/version.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/synchronization/watch_mode.proto b/MutagenSdk/Proto/synchronization/watch_mode.proto
index 624aa0b..b321a18 100644
--- a/MutagenSdk/Proto/synchronization/watch_mode.proto
+++ b/MutagenSdk/Proto/synchronization/watch_mode.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/synchronization/watch_mode.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/synchronization/watch_mode.proto
*
* MIT License
*
diff --git a/MutagenSdk/Proto/url/url.proto b/MutagenSdk/Proto/url/url.proto
index d514f5b..95340e9 100644
--- a/MutagenSdk/Proto/url/url.proto
+++ b/MutagenSdk/Proto/url/url.proto
@@ -1,6 +1,6 @@
/*
* This file was taken from
- * https://github.com/mutagen-io/mutagen/tree/v0.18.1/pkg/url/url.proto
+ * https://github.com/coder/mutagen/tree/v0.18.3/pkg/url/url.proto
*
* MIT License
*
diff --git a/MutagenSdk/Update-Proto.ps1 b/MutagenSdk/Update-Proto.ps1
index 33e69e6..eb9992b 100644
--- a/MutagenSdk/Update-Proto.ps1
+++ b/MutagenSdk/Update-Proto.ps1
@@ -6,7 +6,7 @@ param (
$ErrorActionPreference = "Stop"
-$repo = "mutagen-io/mutagen"
+$repo = "coder/mutagen"
$protoPrefix = "pkg"
$entryFiles = @(
"service/daemon/daemon.proto",
@@ -24,7 +24,7 @@ if (Test-Path $cloneDir) {
Push-Location $cloneDir
try {
& git.exe clean -fdx
- if ($LASTEXITCODE -ne 0) { throw "Failed to clean $mutagenTag" }
+ if ($LASTEXITCODE -ne 0) { throw "Failed to clean $cloneDir" }
# If we're already on the tag, we don't need to fetch or checkout.
if ((& git.exe name-rev --name-only HEAD) -eq "tags/$mutagenTag") {
Write-Host "Already on $mutagenTag"
@@ -96,6 +96,7 @@ foreach ($entryFile in $entryFiles) {
$repoRoot = Resolve-Path (Join-Path $PSScriptRoot "..")
Push-Location $repoRoot
+$outputDir = Resolve-Path $outputDir
if (Test-Path $outputDir) {
Remove-Item -Recurse -Force $outputDir
}
diff --git a/Tests.App/Services/CredentialManagerTest.cs b/Tests.App/Services/CredentialManagerTest.cs
index 2fa4699..9d00cf2 100644
--- a/Tests.App/Services/CredentialManagerTest.cs
+++ b/Tests.App/Services/CredentialManagerTest.cs
@@ -1,7 +1,7 @@
using System.Diagnostics;
using Coder.Desktop.App.Models;
using Coder.Desktop.App.Services;
-using Coder.Desktop.CoderSdk;
+using Coder.Desktop.CoderSdk.Coder;
using Moq;
namespace Coder.Desktop.Tests.App.Services;
diff --git a/Tests.App/Services/MutagenControllerTest.cs b/Tests.App/Services/MutagenControllerTest.cs
index 1605f1c..2c97515 100644
--- a/Tests.App/Services/MutagenControllerTest.cs
+++ b/Tests.App/Services/MutagenControllerTest.cs
@@ -112,6 +112,14 @@ public async Task Ok(CancellationToken ct)
// Ensure the daemon is stopped because all sessions are terminated.
await AssertDaemonStopped(dataDirectory, ct);
+ var progressMessages = new List();
+
+ void OnProgress(string message)
+ {
+ TestContext.Out.WriteLine("Create session progress: " + message);
+ progressMessages.Add(message);
+ }
+
var session1 = await controller.CreateSyncSession(new CreateSyncSessionRequest
{
Alpha = new CreateSyncSessionRequest.Endpoint
@@ -124,7 +132,10 @@ public async Task Ok(CancellationToken ct)
Protocol = CreateSyncSessionRequest.Endpoint.ProtocolKind.Local,
Path = betaDirectory.FullName,
},
- }, ct);
+ }, OnProgress, ct);
+
+ // There should've been at least one progress message.
+ Assert.That(progressMessages, Is.Not.Empty);
state = controller.GetState();
Assert.That(state.SyncSessions, Has.Count.EqualTo(1));
@@ -142,7 +153,7 @@ public async Task Ok(CancellationToken ct)
Protocol = CreateSyncSessionRequest.Endpoint.ProtocolKind.Local,
Path = betaDirectory.FullName,
},
- }, ct);
+ }, null, ct);
state = controller.GetState();
Assert.That(state.SyncSessions, Has.Count.EqualTo(2));
@@ -225,7 +236,7 @@ await controller.CreateSyncSession(new CreateSyncSessionRequest
Protocol = CreateSyncSessionRequest.Endpoint.ProtocolKind.Local,
Path = betaDirectory.FullName,
},
- }, ct);
+ }, null, ct);
}
await AssertDaemonStopped(dataDirectory, ct);
@@ -265,7 +276,7 @@ await controller1.CreateSyncSession(new CreateSyncSessionRequest
Protocol = CreateSyncSessionRequest.Endpoint.ProtocolKind.Local,
Path = betaDirectory.FullName,
},
- }, ct);
+ }, null, ct);
controller2 = new MutagenController(_mutagenBinaryPath, dataDirectory);
await controller2.RefreshState(ct);
diff --git a/Tests.Vpn.Service/DownloaderTest.cs b/Tests.Vpn.Service/DownloaderTest.cs
index 985e331..986ce46 100644
--- a/Tests.Vpn.Service/DownloaderTest.cs
+++ b/Tests.Vpn.Service/DownloaderTest.cs
@@ -284,6 +284,34 @@ public async Task Download(CancellationToken ct)
Assert.That(await File.ReadAllTextAsync(destPath, ct), Is.EqualTo("test"));
}
+ [Test(Description = "Perform 2 downloads with the same destination")]
+ [CancelAfter(30_000)]
+ public async Task DownloadSameDest(CancellationToken ct)
+ {
+ using var httpServer = EchoServer();
+ var url0 = new Uri(httpServer.BaseUrl + "/test0");
+ var url1 = new Uri(httpServer.BaseUrl + "/test1");
+ var destPath = Path.Combine(_tempDir, "test");
+
+ var manager = new Downloader(NullLogger.Instance);
+ var startTask0 = manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url0), destPath,
+ NullDownloadValidator.Instance, ct);
+ var startTask1 = manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url1), destPath,
+ NullDownloadValidator.Instance, ct);
+ var dlTask0 = await startTask0;
+ await dlTask0.Task;
+ Assert.That(dlTask0.TotalBytes, Is.EqualTo(5));
+ Assert.That(dlTask0.BytesRead, Is.EqualTo(5));
+ Assert.That(dlTask0.Progress, Is.EqualTo(1));
+ Assert.That(dlTask0.IsCompleted, Is.True);
+ var dlTask1 = await startTask1;
+ await dlTask1.Task;
+ Assert.That(dlTask1.TotalBytes, Is.EqualTo(5));
+ Assert.That(dlTask1.BytesRead, Is.EqualTo(5));
+ Assert.That(dlTask1.Progress, Is.EqualTo(1));
+ Assert.That(dlTask1.IsCompleted, Is.True);
+ }
+
[Test(Description = "Download with custom headers")]
[CancelAfter(30_000)]
public async Task WithHeaders(CancellationToken ct)
@@ -347,17 +375,17 @@ public async Task DownloadExistingDifferentContent(CancellationToken ct)
[Test(Description = "Unexpected response code from server")]
[CancelAfter(30_000)]
- public void UnexpectedResponseCode(CancellationToken ct)
+ public async Task UnexpectedResponseCode(CancellationToken ct)
{
using var httpServer = new TestHttpServer(ctx => { ctx.Response.StatusCode = 404; });
var url = new Uri(httpServer.BaseUrl + "/test");
var destPath = Path.Combine(_tempDir, "test");
var manager = new Downloader(NullLogger.Instance);
- // The "outer" Task should fail.
- var ex = Assert.ThrowsAsync(async () =>
- await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url), destPath,
- NullDownloadValidator.Instance, ct));
+ // The "inner" Task should fail.
+ var dlTask = await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url), destPath,
+ NullDownloadValidator.Instance, ct);
+ var ex = Assert.ThrowsAsync(async () => await dlTask.Task);
Assert.That(ex.Message, Does.Contain("404"));
}
@@ -384,43 +412,58 @@ public async Task MismatchedETag(CancellationToken ct)
Assert.That(ex.Message, Does.Contain("ETag does not match SHA1 hash of downloaded file").And.Contains("beef"));
}
- [Test(Description = "Timeout on response headers")]
+ [Test(Description = "Timeout waiting for existing download")]
[CancelAfter(30_000)]
- public void CancelledOuter(CancellationToken ct)
+ public async Task CancelledWaitingForOther(CancellationToken ct)
{
- using var httpServer = new TestHttpServer(async _ => { await Task.Delay(TimeSpan.FromSeconds(5), ct); });
- var url = new Uri(httpServer.BaseUrl + "/test");
+ var testCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
+ using var httpServer = new TestHttpServer(async _ =>
+ {
+ await Task.Delay(TimeSpan.FromSeconds(5), testCts.Token);
+ });
+ var url0 = new Uri(httpServer.BaseUrl + "/test0");
+ var url1 = new Uri(httpServer.BaseUrl + "/test1");
var destPath = Path.Combine(_tempDir, "test");
-
var manager = new Downloader(NullLogger.Instance);
- // The "outer" Task should fail.
+
+ // first outer task succeeds, getting download started
+ var dlTask0 = await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url0), destPath,
+ NullDownloadValidator.Instance, testCts.Token);
+
+ // The second request fails if the timeout is short
var smallerCt = new CancellationTokenSource(TimeSpan.FromSeconds(1)).Token;
- Assert.ThrowsAsync(
- async () => await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url), destPath,
- NullDownloadValidator.Instance, smallerCt));
+ Assert.ThrowsAsync(async () => await manager.StartDownloadAsync(
+ new HttpRequestMessage(HttpMethod.Get, url1), destPath,
+ NullDownloadValidator.Instance, smallerCt));
+ await testCts.CancelAsync();
}
[Test(Description = "Timeout on response body")]
[CancelAfter(30_000)]
public async Task CancelledInner(CancellationToken ct)
{
+ var httpCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
+ var taskCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
using var httpServer = new TestHttpServer(async ctx =>
{
ctx.Response.StatusCode = 200;
- await ctx.Response.OutputStream.WriteAsync("test"u8.ToArray(), ct);
- await ctx.Response.OutputStream.FlushAsync(ct);
- await Task.Delay(TimeSpan.FromSeconds(5), ct);
+ await ctx.Response.OutputStream.WriteAsync("test"u8.ToArray(), httpCts.Token);
+ await ctx.Response.OutputStream.FlushAsync(httpCts.Token);
+ // wait up to 5 seconds.
+ await Task.Delay(TimeSpan.FromSeconds(5), httpCts.Token);
});
var url = new Uri(httpServer.BaseUrl + "/test");
var destPath = Path.Combine(_tempDir, "test");
var manager = new Downloader(NullLogger.Instance);
// The "inner" Task should fail.
- var smallerCt = new CancellationTokenSource(TimeSpan.FromSeconds(1)).Token;
+ var taskCt = taskCts.Token;
var dlTask = await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url), destPath,
- NullDownloadValidator.Instance, smallerCt);
+ NullDownloadValidator.Instance, taskCt);
+ await taskCts.CancelAsync();
var ex = Assert.ThrowsAsync(async () => await dlTask.Task);
- Assert.That(ex.CancellationToken, Is.EqualTo(smallerCt));
+ Assert.That(ex.CancellationToken, Is.EqualTo(taskCt));
+ await httpCts.CancelAsync();
}
[Test(Description = "Validation failure")]
@@ -451,12 +494,10 @@ public async Task ValidationFailureExistingFile(CancellationToken ct)
await File.WriteAllTextAsync(destPath, "test", ct);
var manager = new Downloader(NullLogger.Instance);
- // The "outer" Task should fail because the inner task never starts.
- var ex = Assert.ThrowsAsync(async () =>
- {
- await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url), destPath,
- new TestDownloadValidator(new Exception("test exception")), ct);
- });
+ var dlTask = await manager.StartDownloadAsync(new HttpRequestMessage(HttpMethod.Get, url), destPath,
+ new TestDownloadValidator(new Exception("test exception")), ct);
+ // The "inner" Task should fail.
+ var ex = Assert.ThrowsAsync(async () => { await dlTask.Task; });
Assert.That(ex.Message, Does.Contain("Existing file failed validation"));
Assert.That(ex.InnerException, Is.Not.Null);
Assert.That(ex.InnerException!.Message, Is.EqualTo("test exception"));
diff --git a/Tests.Vpn.Service/packages.lock.json b/Tests.Vpn.Service/packages.lock.json
index 7ba4c03..08a9b56 100644
--- a/Tests.Vpn.Service/packages.lock.json
+++ b/Tests.Vpn.Service/packages.lock.json
@@ -48,305 +48,314 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "VuthqFS+ju6vT8W4wevdhEFiRi1trvQtkzWLonApfF5USVzzDcTBoY3F24WvN/tffLSrycArVfX1bThm/9xY2A==",
+ "resolved": "9.0.4",
+ "contentHash": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "+4hfFIY1UjBCXFTTOd+ojlDPq6mep3h5Vq5SYE3Pjucr7dNXmq4S/6P/LoVnZFz2e/5gWp/om4svUFgznfULcA==",
+ "resolved": "9.0.4",
+ "contentHash": "0LN/DiIKvBrkqp7gkF3qhGIeZk6/B63PthAHjQsxymJfIBcz0kbf4/p/t4lMgggVxZ+flRi5xvTwlpPOoZk8fg==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "w7kAyu1Mm7eParRV6WvGNNwA8flPTub16fwH49h7b/yqJZFTgYxnOVCuiah3G2bgseJMEq4DLjjsyQRvsdzRgA==",
+ "resolved": "9.0.4",
+ "contentHash": "cdrjcl9RIcwt3ECbnpP0Gt1+pkjdW90mq5yFYy8D9qRj2NqFFcv3yDp141iEamsd9E218sGxK8WHaIOcrqgDJg==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "5WC1OsXfljC1KHEyL0yefpAyt1UZjrZ0/xyOqFowc5VntbE79JpCYOTSYFlxEuXm3Oq5xsgU2YXeZLTgAAX+DA==",
+ "resolved": "9.0.4",
+ "contentHash": "TbM2HElARG7z1gxwakdppmOkm1SykPqDcu3EF97daEwSb/+TXnRrFfJtF+5FWWxcsNhbRrmLfS2WszYcab7u1A==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "5HShUdF8KFAUSzoEu0DOFbX09FlcFtHxEalowyjM7Kji0EjdF0DLjHajb2IBvoqsExAYox+Z2GfbfGF7dH7lKQ==",
+ "resolved": "9.0.4",
+ "contentHash": "2IGiG3FtVnD83IA6HYGuNei8dOw455C09yEhGl8bjcY6aGZgoC6yhYvDnozw8wlTowfoG9bxVrdTsr2ACZOYHg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "QBOI8YVAyKqeshYOyxSe6co22oag431vxMu5xQe1EjXMkYE4xK4J71xLCW3/bWKmr9Aoy1VqGUARSLFnotk4Bg==",
+ "resolved": "9.0.4",
+ "contentHash": "UY864WQ3AS2Fkc8fYLombWnjrXwYt+BEHHps0hY4sxlgqaVW06AxbpgRZjfYf8PyRbplJqruzZDB/nSLT+7RLQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "z+g+lgPET1JRDjsOkFe51rkkNcnJgvOK5UIpeTfF1iAi0GkBJz5/yUuTa8a9V8HUh4gj4xFT5WGoMoXoSDKfGg==",
+ "resolved": "9.0.4",
+ "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.FileExtensions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "System.Text.Json": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "System.Text.Json": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "esGPOgLZ1tZddEomexhrU+LJ5YIsuJdkh0tU7r4WVpNZ15dLuMPqPW4Xe4txf3T2PDUX2ILe3nYQEDjZjfSEJg==",
+ "resolved": "9.0.4",
+ "contentHash": "zuvyC72gJkJyodyGowCuz3EQ1QvzNXJtKusuRzmjoHr17aeB3X0aSiKFB++HMHnQIWWlPOBf9YHTQfEqzbgl1g==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Json": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Json": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.4"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "qZI42ASAe3hr2zMSA6UjM92pO1LeDq5DcwkgSowXXPY8I56M76pEKrnmsKKbxagAf39AJxkH2DY4sb72ixyOrg==",
+ "resolved": "9.0.4",
+ "contentHash": "f2MTUaS2EQ3lX4325ytPAISZqgBfXmY0WvgD80ji6Z20AoDNiCESxsqo6mFRwHJD/jfVKRw9FsW6+86gNre3ug==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "Tr74eP0oQ3AyC24ch17N8PuEkrPbD0JqIfENCYqmgKYNOmL8wQKzLJu3ObxTUDrjnn4rHoR1qKa37/eQyHmCDA=="
+ "resolved": "9.0.4",
+ "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "saxr2XzwgDU77LaQfYFXmddEDRUKHF4DaGMZkNB3qjdVSZlax3//dGJagJkKrGMIPNZs2jVFXITyCCR6UHJNdA==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "9.0.0",
+ "System.Text.Json": "9.0.0"
+ }
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "4ZmP6turxMFsNwK/MCko2fuIITaYYN/eXyyIRq1FjLDKnptdbn6xMb7u0zfSMzCGpzkx4RxH/g1jKN2IchG7uA==",
+ "resolved": "9.0.4",
+ "contentHash": "1bCSQrGv9+bpF5MGKF6THbnRFUZqQDrWPA39NDeVW9djeHBmow8kX4SX6/8KkeKI8gmUDG7jsG/bVuNAcY/ATQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4"
}
},
"Microsoft.Extensions.Diagnostics.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "pfAPuVtHvG6dvZtAa0OQbXdDqq6epnr8z0/IIUjdmV0tMeI8Aj9KxDXvdDvqr+qNHTkmA7pZpChNxwNZt4GXVg==",
+ "resolved": "9.0.4",
+ "contentHash": "IAucBcHYtiCmMyFag+Vrp5m+cjGRlDttJk9Vx7Dqpq+Ama4BzVUOk0JARQakgFFr7ZTBSgLKlHmtY5MiItB7Cg==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "System.Diagnostics.DiagnosticSource": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "System.Diagnostics.DiagnosticSource": "9.0.4"
}
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "DguZYt1DWL05+8QKWL3b6bW7A2pC5kYFMY5iXM6W2M23jhvcNa8v6AU8PvVJBcysxHwr9/jax0agnwoBumsSwg==",
+ "resolved": "9.0.4",
+ "contentHash": "gQN2o/KnBfVk6Bd71E2YsvO5lsqrqHmaepDGk+FB/C4aiQY9B0XKKNKfl5/TqcNOs9OEithm4opiMHAErMFyEw==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "TKDMNRS66UTMEVT38/tU9hA63UTMvzI3DyNm5mx8+JCf3BaOtxgrvWLCI1y3J52PzT5yNl/T2KN5Z0KbApLZcg==",
+ "resolved": "9.0.4",
+ "contentHash": "qkQ9V7KFZdTWNThT7ke7E/Jad38s46atSs3QUYZB8f3thBTrcrousdY4Y/tyCtcH5YjsPSiByjuN+L8W/ThMQg==",
"dependencies": {
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileSystemGlobbing": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileSystemGlobbing": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "Mxcp9NXuQMvAnudRZcgIb5SqlWrlullQzntBLTwuv0MPIJ5LqiGwbRqiyxgdk+vtCoUkplb0oXy5kAw1t469Ug=="
+ "resolved": "9.0.4",
+ "contentHash": "05Lh2ItSk4mzTdDWATW9nEcSybwprN8Tz42Fs5B+jwdXUpauktdAQUI1Am4sUQi2C63E5hvQp8gXvfwfg9mQGQ=="
},
"Microsoft.Extensions.Hosting": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "3wZNcVvC8RW44HDqqmIq+BqF5pgmTQdbNdR9NyYw33JSMnJuclwoJ2PEkrJ/KvD1U/hmqHVL3l5If+Hn3D1fWA==",
- "dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Binder": "9.0.1",
- "Microsoft.Extensions.Configuration.CommandLine": "9.0.1",
- "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.1",
- "Microsoft.Extensions.Configuration.FileExtensions": "9.0.1",
- "Microsoft.Extensions.Configuration.Json": "9.0.1",
- "Microsoft.Extensions.Configuration.UserSecrets": "9.0.1",
- "Microsoft.Extensions.DependencyInjection": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Diagnostics": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.1",
- "Microsoft.Extensions.Hosting.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging.Configuration": "9.0.1",
- "Microsoft.Extensions.Logging.Console": "9.0.1",
- "Microsoft.Extensions.Logging.Debug": "9.0.1",
- "Microsoft.Extensions.Logging.EventLog": "9.0.1",
- "Microsoft.Extensions.Logging.EventSource": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1"
+ "resolved": "9.0.4",
+ "contentHash": "1rZwLE+tTUIyZRUzmlk/DQj+v+Eqox+rjb+X7Fi+cYTbQfIZPYwpf1pVybsV3oje8+Pe4GaNukpBVUlPYeQdeQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.4",
+ "Microsoft.Extensions.Configuration.CommandLine": "9.0.4",
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.4",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Json": "9.0.4",
+ "Microsoft.Extensions.Configuration.UserSecrets": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Diagnostics": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.4",
+ "Microsoft.Extensions.Hosting.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.4",
+ "Microsoft.Extensions.Logging.Console": "9.0.4",
+ "Microsoft.Extensions.Logging.Debug": "9.0.4",
+ "Microsoft.Extensions.Logging.EventLog": "9.0.4",
+ "Microsoft.Extensions.Logging.EventSource": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4"
}
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "CwSMhLNe8HLkfbFzdz0CHWJhtWH3TtfZSicLBd/itFD+NqQtfGHmvqXHQbaFFl3mQB5PBb2gxwzWQyW2pIj7PA==",
+ "resolved": "9.0.4",
+ "contentHash": "bXkwRPMo4x19YKH6/V9XotU7KYQJlihXhcWO1RDclAY3yfY3XNg4QtSEBvng4kK/DnboE0O/nwSl+6Jiv9P+FA==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Hosting.WindowsServices": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "FLapgOXQzPjUsbMqjjagCFCiGjroRmrmHQVK3/PEovRIvDU6nLk7KKs4PalzEHaIfqG+PySlY/BeLTyZtjcshg==",
+ "resolved": "9.0.4",
+ "contentHash": "QFeUS0NG4Kwq91Mf1WzVZSbBtw+nKxyOQTi4xTRUEQ2gC7HWiyCUiX0arMJxt9lWwbjXxQY9TQjDptm+ct7BkQ==",
"dependencies": {
- "Microsoft.Extensions.Hosting": "9.0.1",
- "Microsoft.Extensions.Logging.EventLog": "9.0.1",
- "System.ServiceProcess.ServiceController": "9.0.1"
+ "Microsoft.Extensions.Hosting": "9.0.4",
+ "Microsoft.Extensions.Logging.EventLog": "9.0.4",
+ "System.ServiceProcess.ServiceController": "9.0.4"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "E/k5r7S44DOW+08xQPnNbO8DKAQHhkspDboTThNJ6Z3/QBb4LC6gStNWzVmy3IvW7sUD+iJKf4fj0xEkqE7vnQ==",
+ "resolved": "9.0.4",
+ "contentHash": "xW6QPYsqhbuWBO9/1oA43g/XPKbohJx+7G8FLQgQXIriYvY7s+gxr2wjQJfRoPO900dvvv2vVH7wZovG+M1m6w==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "w2gUqXN/jNIuvqYwX3lbXagsizVNXYyt6LlF57+tMve4JYCEgCMMAjRce6uKcDASJgpMbErRT1PfHy2OhbkqEA==",
+ "resolved": "9.0.4",
+ "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "System.Diagnostics.DiagnosticSource": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "System.Diagnostics.DiagnosticSource": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "MeZePlyu3/74Wk4FHYSzXijADJUhWa7gxtaphLxhS8zEPWdJuBCrPo0sezdCSZaKCL+cZLSLobrb7xt2zHOxZQ==",
+ "resolved": "9.0.4",
+ "contentHash": "/kF+rSnoo3/nIwGzWsR4RgBnoTOdZ3lzz2qFRyp/GgaNid4j6hOAQrs/O+QHXhlcAdZxjg37MvtIE+pAvIgi9g==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Binder": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "YUzguHYlWfp4upfYlpVe3dnY59P25wc+/YLJ9/NQcblT3EvAB1CObQulClll7NtnFbbx4Js0a0UfyS8SbRsWXQ==",
+ "resolved": "9.0.4",
+ "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging.Configuration": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "System.Text.Json": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "System.Text.Json": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "pzdyibIV8k4sym0Sszcp2MJCuXrpOGs9qfOvY+hCRu8k4HbdVoeKOLnacxHK6vEPITX5o5FjjsZW2zScLXTjYA==",
+ "resolved": "9.0.4",
+ "contentHash": "D1jy+jy+huUUxnkZ0H480RZK8vqKn8NsQxYpMpPL/ALPPh1WATVLcr/uXI3RUBB45wMW5265O+hk9x3jnnXFuA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "+a4RlbwFWjsMujNNhf1Jy9Nm5CpMT+nxXxfgrkRSloPo0OAWhPSPsrFo6VWpvgIPPS41qmfAVWr3DqAmOoVZgQ==",
+ "resolved": "9.0.4",
+ "contentHash": "bApxdklf7QTsONOLR5ow6SdDFXR5ncHvumSEg2+QnCvxvkzc2z5kNn7yQCyupRLRN4jKbnlTkVX8x9qLlwL6Qg==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "System.Diagnostics.EventLog": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "System.Diagnostics.EventLog": "9.0.4"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "d47ZRZUOg1dGOX+yisWScQ7w4+92OlR9beS2UXaiadUCA3RFoZzobzVgrzBX7Oo/qefx9LxdRcaeFpWKb3BNBw==",
+ "resolved": "9.0.4",
+ "contentHash": "R600zTxVJNw2IeAEOvdOJGNA1lHr1m3vo460hSF5G1DjwP0FNpyeH4lpLDMuf34diKwB1LTt5hBw1iF1/iuwsQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1",
- "System.Text.Json": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4",
+ "System.Text.Json": "9.0.4"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "nggoNKnWcsBIAaOWHA+53XZWrslC7aGeok+aR+epDPRy7HI7GwMnGZE8yEsL2Onw7kMOHVHwKcsDls1INkNUJQ==",
+ "resolved": "9.0.4",
+ "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "8RRKWtuU4fR+8MQLR/8CqZwZ9yc2xCpllw/WPRY7kskIqEq0hMcEI4AfUJO72yGiK2QJkrsDcUvgB5Yc+3+lyg==",
+ "resolved": "9.0.4",
+ "contentHash": "aridVhAT3Ep+vsirR1pzjaOw0Jwiob6dc73VFQn2XmDfBA2X98M8YKO1GarvsXRX7gX1Aj+hj2ijMzrMHDOm0A==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Binder": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Options.DataAnnotations": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "T16k12gDWOoi9W/oueC7knsZxm3ZjqmrQBFLXx9UH3Kv4fbehMyiOdhi5u1Vw7M4g0uMj21InBfgDE0570byEQ==",
+ "resolved": "9.0.4",
+ "contentHash": "jJq7xO1PLi//cts59Yp6dKNN07xV0Day/JmVR7aXCdo2rYHAoFlyARyxrfB0CTzsErA+TOhYTz2Ee0poR8SPeQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "bHtTesA4lrSGD1ZUaMIx6frU3wyy0vYtTa/hM6gGQu5QNrydObv8T5COiGUWsisflAfmsaFOe9Xvw5NSO99z0g=="
+ "resolved": "9.0.4",
+ "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA=="
},
"Microsoft.Security.Extensions": {
"type": "Transitive",
@@ -409,6 +418,16 @@
"Serilog": "4.2.0"
}
},
+ "Serilog.Settings.Configuration": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "4/Et4Cqwa+F88l5SeFeNZ4c4Z6dEAIKbu3MaQb2Zz9F/g27T5a3wvfMcmCOaAiACjfUb4A6wrlTVfyYUZk3RRQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "9.0.0",
+ "Microsoft.Extensions.DependencyModel": "9.0.0",
+ "Serilog": "4.2.0"
+ }
+ },
"Serilog.Sinks.Console": {
"type": "Transitive",
"resolved": "6.0.0",
@@ -427,18 +446,18 @@
},
"System.Diagnostics.DiagnosticSource": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "yOcDWx4P/s1I83+7gQlgQLmhny2eNcU0cfo1NBWi+en4EAI38Jau+/neT85gUW6w1s7+FUJc2qNOmmwGLIREqA=="
+ "resolved": "9.0.4",
+ "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "iVnDpgYJsRaRFnk77kcLA3+913WfWDtnAKrQl9tQ5ahqKANTaJKmQdsuPWWiAPWE9pk1Kj4Pg9JGXWfFYYyakQ=="
+ "resolved": "9.0.4",
+ "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ=="
},
"System.IO.Pipelines": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "uXf5o8eV/gtzDQY4lGROLFMWQvcViKcF8o4Q6KpIOjloAQXrnscQSu6gTxYJMHuNJnh7szIF9AzkaEq+zDLoEg=="
+ "resolved": "9.0.4",
+ "contentHash": "luF2Xba+lTe2GOoNQdZLe8q7K6s7nSpWZl9jIwWNMszN4/Yv0lmxk9HISgMmwdyZ83i3UhAGXaSY9o6IJBUuuA=="
},
"System.Reflection.Metadata": {
"type": "Transitive",
@@ -447,24 +466,24 @@
},
"System.ServiceProcess.ServiceController": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "Ghm4yP29P3cC65Qof8CrgU3WO/q3ERtht6/CrvcUl1FgRs6D7exj75GuG4ciRv0sjygtvyd675924DFsxxnEgA==",
+ "resolved": "9.0.4",
+ "contentHash": "j6Z+ED1d/yxe/Cm+UlFf+LNw2HSYBSgtFh71KnEEmUtHIwgoTVQxji5URvXPOAZ7iuKHItjMIzpCLyRZc8OmrQ==",
"dependencies": {
- "System.Diagnostics.EventLog": "9.0.1"
+ "System.Diagnostics.EventLog": "9.0.4"
}
},
"System.Text.Encodings.Web": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "XkspqduP2t1e1x2vBUAD/xZ5ZDvmywuUwsmB93MvyQLospJfqtX0GsR/kU0vUL2h4kmvf777z3txV2W4NrQ9Qg=="
+ "resolved": "9.0.4",
+ "contentHash": "V+5cCPpk1S2ngekUs9nDrQLHGiWFZMg8BthADQr+Fwi59a8DdHFu26S2oi9Bfgv+d67bqmkPqctJXMEXiimXUg=="
},
"System.Text.Json": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "eqWHDZqYPv1PvuvoIIx5pF74plL3iEOZOl/0kQP+Y0TEbtgNnM2W6k8h8EPYs+LTJZsXuWa92n5W5sHTWvE3VA==",
+ "resolved": "9.0.4",
+ "contentHash": "pYtmpcO6R3Ef1XilZEHgXP2xBPVORbYEzRP7dl0IAAbN8Dm+kfwio8aCKle97rAWXOExr292MuxWYurIuwN62g==",
"dependencies": {
- "System.IO.Pipelines": "9.0.1",
- "System.Text.Encodings.Web": "9.0.1"
+ "System.IO.Pipelines": "9.0.4",
+ "System.Text.Encodings.Web": "9.0.4"
}
},
"Coder.Desktop.CoderSdk": {
@@ -490,12 +509,13 @@
"dependencies": {
"Coder.Desktop.CoderSdk": "[1.0.0, )",
"Coder.Desktop.Vpn": "[1.0.0, )",
- "Microsoft.Extensions.Hosting": "[9.0.1, )",
- "Microsoft.Extensions.Hosting.WindowsServices": "[9.0.1, )",
- "Microsoft.Extensions.Options.DataAnnotations": "[9.0.1, )",
+ "Microsoft.Extensions.Hosting": "[9.0.4, )",
+ "Microsoft.Extensions.Hosting.WindowsServices": "[9.0.4, )",
+ "Microsoft.Extensions.Options.DataAnnotations": "[9.0.4, )",
"Microsoft.Security.Extensions": "[1.3.0, )",
"Semver": "[3.0.0, )",
"Serilog.Extensions.Hosting": "[9.0.0, )",
+ "Serilog.Settings.Configuration": "[9.0.0, )",
"Serilog.Sinks.Console": "[6.0.0, )",
"Serilog.Sinks.File": "[6.0.0, )"
}
diff --git a/Vpn.Service/Downloader.cs b/Vpn.Service/Downloader.cs
index a37a1ec..6a3108b 100644
--- a/Vpn.Service/Downloader.cs
+++ b/Vpn.Service/Downloader.cs
@@ -3,6 +3,7 @@
using System.Formats.Asn1;
using System.Net;
using System.Runtime.CompilerServices;
+using System.Runtime.ExceptionServices;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using Coder.Desktop.Vpn.Utilities;
@@ -286,9 +287,24 @@ public async Task StartDownloadAsync(HttpRequestMessage req, strin
{
while (true)
{
+ ct.ThrowIfCancellationRequested();
var task = _downloads.GetOrAdd(destinationPath,
_ => new DownloadTask(_logger, req, destinationPath, validator));
- await task.EnsureStartedAsync(ct);
+ // EnsureStarted is a no-op if we didn't create a new DownloadTask.
+ // So, we will only remove the destination once for each time we start a new task.
+ task.EnsureStarted(tsk =>
+ {
+ // remove the key first, before checking the exception, to ensure
+ // we still clean up.
+ _downloads.TryRemove(destinationPath, out _);
+ if (tsk.Exception == null) return;
+
+ if (tsk.Exception.InnerException != null)
+ ExceptionDispatchInfo.Capture(tsk.Exception.InnerException).Throw();
+
+ // not sure if this is hittable, but just in case:
+ throw tsk.Exception;
+ }, ct);
// If the existing (or new) task is for the same URL, return it.
if (task.Request.RequestUri == req.RequestUri)
@@ -302,7 +318,22 @@ public async Task StartDownloadAsync(HttpRequestMessage req, strin
_logger.LogWarning(
"Download for '{DestinationPath}' is already in progress, but is for a different Url - awaiting completion",
destinationPath);
- await task.Task;
+ await TaskOrCancellation(task.Task, ct);
+ }
+ }
+
+ ///
+ /// TaskOrCancellation waits for either the task to complete, or the given token to be canceled.
+ ///
+ internal static async Task TaskOrCancellation(Task task, CancellationToken cancellationToken)
+ {
+ var cancellationTask = new TaskCompletionSource();
+ await using (cancellationToken.Register(() => cancellationTask.TrySetCanceled()))
+ {
+ // Wait for either the task or the cancellation
+ var completedTask = await Task.WhenAny(task, cancellationTask.Task);
+ // Await to propagate exceptions, if any
+ await completedTask;
}
}
}
@@ -357,13 +388,11 @@ internal DownloadTask(ILogger logger, HttpRequestMessage req, string destination
".download-" + Path.GetRandomFileName());
}
- internal async Task EnsureStartedAsync(CancellationToken ct = default)
+ internal void EnsureStarted(Action continuation, CancellationToken ct = default)
{
- using var _ = await _semaphore.LockAsync(ct);
+ using var _ = _semaphore.Lock();
if (Task == null!)
- Task = await StartDownloadAsync(ct);
-
- return Task;
+ Task = Start(ct).ContinueWith(continuation, ct);
}
///
@@ -371,7 +400,7 @@ internal async Task EnsureStartedAsync(CancellationToken ct = default)
/// and the download will continue in the background. The provided CancellationToken can be used to cancel the
/// download.
///
- private async Task StartDownloadAsync(CancellationToken ct = default)
+ private async Task Start(CancellationToken ct = default)
{
Directory.CreateDirectory(_destinationDirectory);
@@ -398,8 +427,7 @@ private async Task StartDownloadAsync(CancellationToken ct = default)
throw new Exception("Existing file failed validation after 304 Not Modified", e);
}
- Task = Task.CompletedTask;
- return Task;
+ return;
}
if (res.StatusCode != HttpStatusCode.OK)
@@ -420,27 +448,25 @@ private async Task StartDownloadAsync(CancellationToken ct = default)
if (res.Content.Headers.ContentLength >= 0)
TotalBytes = (ulong)res.Content.Headers.ContentLength;
- FileStream tempFile;
- try
- {
- tempFile = File.Create(TempDestinationPath, BufferSize,
- FileOptions.Asynchronous | FileOptions.SequentialScan);
- }
- catch (Exception e)
- {
- _logger.LogError(e, "Failed to create temporary file '{TempDestinationPath}'", TempDestinationPath);
- throw;
- }
-
- Task = DownloadAsync(res, tempFile, ct);
- return Task;
+ await Download(res, ct);
}
- private async Task DownloadAsync(HttpResponseMessage res, FileStream tempFile, CancellationToken ct)
+ private async Task Download(HttpResponseMessage res, CancellationToken ct)
{
try
{
var sha1 = res.Headers.Contains("ETag") ? SHA1.Create() : null;
+ FileStream tempFile;
+ try
+ {
+ tempFile = File.Create(TempDestinationPath, BufferSize, FileOptions.SequentialScan);
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "Failed to create temporary file '{TempDestinationPath}'", TempDestinationPath);
+ throw;
+ }
+
await using (tempFile)
{
var stream = await res.Content.ReadAsStreamAsync(ct);
diff --git a/Vpn.Service/Manager.cs b/Vpn.Service/Manager.cs
index 1eca8bf..fc014c0 100644
--- a/Vpn.Service/Manager.cs
+++ b/Vpn.Service/Manager.cs
@@ -1,5 +1,5 @@
using System.Runtime.InteropServices;
-using Coder.Desktop.CoderSdk;
+using Coder.Desktop.CoderSdk.Coder;
using Coder.Desktop.Vpn.Proto;
using Coder.Desktop.Vpn.Utilities;
using Microsoft.Extensions.Logging;
diff --git a/Vpn.Service/ManagerConfig.cs b/Vpn.Service/ManagerConfig.cs
index c7f8863..c60b1b8 100644
--- a/Vpn.Service/ManagerConfig.cs
+++ b/Vpn.Service/ManagerConfig.cs
@@ -15,8 +15,6 @@ public class ManagerConfig
[Required] public string TunnelBinaryPath { get; set; } = @"C:\coder-vpn.exe";
- [Required] public string LogFileLocation { get; set; } = @"C:\coder-desktop-service.log";
-
// If empty, signatures will not be verified.
[Required] public string TunnelBinarySignatureSigner { get; set; } = "Coder Technologies Inc.";
diff --git a/Vpn.Service/Program.cs b/Vpn.Service/Program.cs
index 69b6ea8..fc61247 100644
--- a/Vpn.Service/Program.cs
+++ b/Vpn.Service/Program.cs
@@ -3,6 +3,7 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Win32;
using Serilog;
+using ILogger = Serilog.ILogger;
namespace Coder.Desktop.Vpn.Service;
@@ -14,29 +15,22 @@ public static class Program
// installer.
#if !DEBUG
private const string ServiceName = "Coder Desktop";
- private const string ManagerConfigSection = "Manager";
+ private const string ConfigSubKey = @"SOFTWARE\Coder Desktop\VpnService";
#else
// This value matches Create-Service.ps1.
private const string ServiceName = "Coder Desktop (Debug)";
- private const string ManagerConfigSection = "DebugManager";
+ private const string ConfigSubKey = @"SOFTWARE\Coder Desktop\DebugVpnService";
#endif
- private const string ConsoleOutputTemplate =
- "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} - {Message:lj}{NewLine}{Exception}";
-
- private const string FileOutputTemplate =
- "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext} - {Message:lj}{NewLine}{Exception}";
+ private const string ManagerConfigSection = "Manager";
private static ILogger MainLogger => Log.ForContext("SourceContext", "Coder.Desktop.Vpn.Service.Program");
- private static LoggerConfiguration BaseLogConfig => new LoggerConfiguration()
- .Enrich.FromLogContext()
- .MinimumLevel.Debug()
- .WriteTo.Console(outputTemplate: ConsoleOutputTemplate);
-
public static async Task Main(string[] args)
{
- Log.Logger = BaseLogConfig.CreateLogger();
+ // This logger will only be used until we load our full logging configuration and replace it.
+ Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Console()
+ .CreateLogger();
MainLogger.Information("Application is starting");
try
{
@@ -58,27 +52,26 @@ public static async Task Main(string[] args)
private static async Task BuildAndRun(string[] args)
{
var builder = Host.CreateApplicationBuilder(args);
+ var configBuilder = builder.Configuration as IConfigurationBuilder;
// Configuration sources
builder.Configuration.Sources.Clear();
- (builder.Configuration as IConfigurationBuilder).Add(
- new RegistryConfigurationSource(Registry.LocalMachine, @"SOFTWARE\Coder Desktop"));
+ AddDefaultConfig(configBuilder);
+ configBuilder.Add(
+ new RegistryConfigurationSource(Registry.LocalMachine, ConfigSubKey));
builder.Configuration.AddEnvironmentVariables("CODER_MANAGER_");
builder.Configuration.AddCommandLine(args);
// Options types (these get registered as IOptions singletons)
builder.Services.AddOptions()
.Bind(builder.Configuration.GetSection(ManagerConfigSection))
- .ValidateDataAnnotations()
- .PostConfigure(config =>
- {
- Log.Logger = BaseLogConfig
- .WriteTo.File(config.LogFileLocation, outputTemplate: FileOutputTemplate)
- .CreateLogger();
- });
+ .ValidateDataAnnotations();
// Logging
- builder.Services.AddSerilog();
+ builder.Services.AddSerilog((_, loggerConfig) =>
+ {
+ loggerConfig.ReadFrom.Configuration(builder.Configuration);
+ });
// Singletons
builder.Services.AddSingleton();
@@ -101,6 +94,32 @@ private static async Task BuildAndRun(string[] args)
builder.Services.AddHostedService();
builder.Services.AddHostedService();
- await builder.Build().RunAsync();
+ var host = builder.Build();
+ Log.Logger = (ILogger)host.Services.GetService(typeof(ILogger))!;
+ MainLogger.Information("Application is starting");
+
+ await host.RunAsync();
+ }
+
+ private static void AddDefaultConfig(IConfigurationBuilder builder)
+ {
+ builder.AddInMemoryCollection(new Dictionary
+ {
+ ["Serilog:Using:0"] = "Serilog.Sinks.File",
+ ["Serilog:Using:1"] = "Serilog.Sinks.Console",
+
+ ["Serilog:MinimumLevel"] = "Information",
+ ["Serilog:Enrich:0"] = "FromLogContext",
+
+ ["Serilog:WriteTo:0:Name"] = "File",
+ ["Serilog:WriteTo:0:Args:path"] = @"C:\coder-desktop-service.log",
+ ["Serilog:WriteTo:0:Args:outputTemplate"] =
+ "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext} - {Message:lj}{NewLine}{Exception}",
+ ["Serilog:WriteTo:0:Args:rollingInterval"] = "Day",
+
+ ["Serilog:WriteTo:1:Name"] = "Console",
+ ["Serilog:WriteTo:1:Args:outputTemplate"] =
+ "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} - {Message:lj}{NewLine}{Exception}",
+ });
}
}
diff --git a/Vpn.Service/Vpn.Service.csproj b/Vpn.Service/Vpn.Service.csproj
index acaeb3c..aaed3cc 100644
--- a/Vpn.Service/Vpn.Service.csproj
+++ b/Vpn.Service/Vpn.Service.csproj
@@ -25,12 +25,13 @@
-
-
-
+
+
+
+
diff --git a/Vpn.Service/packages.lock.json b/Vpn.Service/packages.lock.json
index fb4185a..09c7b76 100644
--- a/Vpn.Service/packages.lock.json
+++ b/Vpn.Service/packages.lock.json
@@ -4,53 +4,53 @@
"net8.0-windows7.0": {
"Microsoft.Extensions.Hosting": {
"type": "Direct",
- "requested": "[9.0.1, )",
- "resolved": "9.0.1",
- "contentHash": "3wZNcVvC8RW44HDqqmIq+BqF5pgmTQdbNdR9NyYw33JSMnJuclwoJ2PEkrJ/KvD1U/hmqHVL3l5If+Hn3D1fWA==",
- "dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Binder": "9.0.1",
- "Microsoft.Extensions.Configuration.CommandLine": "9.0.1",
- "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.1",
- "Microsoft.Extensions.Configuration.FileExtensions": "9.0.1",
- "Microsoft.Extensions.Configuration.Json": "9.0.1",
- "Microsoft.Extensions.Configuration.UserSecrets": "9.0.1",
- "Microsoft.Extensions.DependencyInjection": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Diagnostics": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.1",
- "Microsoft.Extensions.Hosting.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging.Configuration": "9.0.1",
- "Microsoft.Extensions.Logging.Console": "9.0.1",
- "Microsoft.Extensions.Logging.Debug": "9.0.1",
- "Microsoft.Extensions.Logging.EventLog": "9.0.1",
- "Microsoft.Extensions.Logging.EventSource": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1"
+ "requested": "[9.0.4, )",
+ "resolved": "9.0.4",
+ "contentHash": "1rZwLE+tTUIyZRUzmlk/DQj+v+Eqox+rjb+X7Fi+cYTbQfIZPYwpf1pVybsV3oje8+Pe4GaNukpBVUlPYeQdeQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.4",
+ "Microsoft.Extensions.Configuration.CommandLine": "9.0.4",
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.4",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Json": "9.0.4",
+ "Microsoft.Extensions.Configuration.UserSecrets": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Diagnostics": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.4",
+ "Microsoft.Extensions.Hosting.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.4",
+ "Microsoft.Extensions.Logging.Console": "9.0.4",
+ "Microsoft.Extensions.Logging.Debug": "9.0.4",
+ "Microsoft.Extensions.Logging.EventLog": "9.0.4",
+ "Microsoft.Extensions.Logging.EventSource": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4"
}
},
"Microsoft.Extensions.Hosting.WindowsServices": {
"type": "Direct",
- "requested": "[9.0.1, )",
- "resolved": "9.0.1",
- "contentHash": "FLapgOXQzPjUsbMqjjagCFCiGjroRmrmHQVK3/PEovRIvDU6nLk7KKs4PalzEHaIfqG+PySlY/BeLTyZtjcshg==",
+ "requested": "[9.0.4, )",
+ "resolved": "9.0.4",
+ "contentHash": "QFeUS0NG4Kwq91Mf1WzVZSbBtw+nKxyOQTi4xTRUEQ2gC7HWiyCUiX0arMJxt9lWwbjXxQY9TQjDptm+ct7BkQ==",
"dependencies": {
- "Microsoft.Extensions.Hosting": "9.0.1",
- "Microsoft.Extensions.Logging.EventLog": "9.0.1",
- "System.ServiceProcess.ServiceController": "9.0.1"
+ "Microsoft.Extensions.Hosting": "9.0.4",
+ "Microsoft.Extensions.Logging.EventLog": "9.0.4",
+ "System.ServiceProcess.ServiceController": "9.0.4"
}
},
"Microsoft.Extensions.Options.DataAnnotations": {
"type": "Direct",
- "requested": "[9.0.1, )",
- "resolved": "9.0.1",
- "contentHash": "T16k12gDWOoi9W/oueC7knsZxm3ZjqmrQBFLXx9UH3Kv4fbehMyiOdhi5u1Vw7M4g0uMj21InBfgDE0570byEQ==",
+ "requested": "[9.0.4, )",
+ "resolved": "9.0.4",
+ "contentHash": "jJq7xO1PLi//cts59Yp6dKNN07xV0Day/JmVR7aXCdo2rYHAoFlyARyxrfB0CTzsErA+TOhYTz2Ee0poR8SPeQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4"
}
},
"Microsoft.Security.Extensions": {
@@ -81,6 +81,17 @@
"Serilog.Extensions.Logging": "9.0.0"
}
},
+ "Serilog.Settings.Configuration": {
+ "type": "Direct",
+ "requested": "[9.0.0, )",
+ "resolved": "9.0.0",
+ "contentHash": "4/Et4Cqwa+F88l5SeFeNZ4c4Z6dEAIKbu3MaQb2Zz9F/g27T5a3wvfMcmCOaAiACjfUb4A6wrlTVfyYUZk3RRQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "9.0.0",
+ "Microsoft.Extensions.DependencyModel": "9.0.0",
+ "Serilog": "4.2.0"
+ }
+ },
"Serilog.Sinks.Console": {
"type": "Direct",
"requested": "[6.0.0, )",
@@ -106,257 +117,266 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "VuthqFS+ju6vT8W4wevdhEFiRi1trvQtkzWLonApfF5USVzzDcTBoY3F24WvN/tffLSrycArVfX1bThm/9xY2A==",
+ "resolved": "9.0.4",
+ "contentHash": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "+4hfFIY1UjBCXFTTOd+ojlDPq6mep3h5Vq5SYE3Pjucr7dNXmq4S/6P/LoVnZFz2e/5gWp/om4svUFgznfULcA==",
+ "resolved": "9.0.4",
+ "contentHash": "0LN/DiIKvBrkqp7gkF3qhGIeZk6/B63PthAHjQsxymJfIBcz0kbf4/p/t4lMgggVxZ+flRi5xvTwlpPOoZk8fg==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "w7kAyu1Mm7eParRV6WvGNNwA8flPTub16fwH49h7b/yqJZFTgYxnOVCuiah3G2bgseJMEq4DLjjsyQRvsdzRgA==",
+ "resolved": "9.0.4",
+ "contentHash": "cdrjcl9RIcwt3ECbnpP0Gt1+pkjdW90mq5yFYy8D9qRj2NqFFcv3yDp141iEamsd9E218sGxK8WHaIOcrqgDJg==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "5WC1OsXfljC1KHEyL0yefpAyt1UZjrZ0/xyOqFowc5VntbE79JpCYOTSYFlxEuXm3Oq5xsgU2YXeZLTgAAX+DA==",
+ "resolved": "9.0.4",
+ "contentHash": "TbM2HElARG7z1gxwakdppmOkm1SykPqDcu3EF97daEwSb/+TXnRrFfJtF+5FWWxcsNhbRrmLfS2WszYcab7u1A==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "5HShUdF8KFAUSzoEu0DOFbX09FlcFtHxEalowyjM7Kji0EjdF0DLjHajb2IBvoqsExAYox+Z2GfbfGF7dH7lKQ==",
+ "resolved": "9.0.4",
+ "contentHash": "2IGiG3FtVnD83IA6HYGuNei8dOw455C09yEhGl8bjcY6aGZgoC6yhYvDnozw8wlTowfoG9bxVrdTsr2ACZOYHg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "QBOI8YVAyKqeshYOyxSe6co22oag431vxMu5xQe1EjXMkYE4xK4J71xLCW3/bWKmr9Aoy1VqGUARSLFnotk4Bg==",
+ "resolved": "9.0.4",
+ "contentHash": "UY864WQ3AS2Fkc8fYLombWnjrXwYt+BEHHps0hY4sxlgqaVW06AxbpgRZjfYf8PyRbplJqruzZDB/nSLT+7RLQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "z+g+lgPET1JRDjsOkFe51rkkNcnJgvOK5UIpeTfF1iAi0GkBJz5/yUuTa8a9V8HUh4gj4xFT5WGoMoXoSDKfGg==",
+ "resolved": "9.0.4",
+ "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.FileExtensions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "System.Text.Json": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "System.Text.Json": "9.0.4"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "esGPOgLZ1tZddEomexhrU+LJ5YIsuJdkh0tU7r4WVpNZ15dLuMPqPW4Xe4txf3T2PDUX2ILe3nYQEDjZjfSEJg==",
+ "resolved": "9.0.4",
+ "contentHash": "zuvyC72gJkJyodyGowCuz3EQ1QvzNXJtKusuRzmjoHr17aeB3X0aSiKFB++HMHnQIWWlPOBf9YHTQfEqzbgl1g==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Json": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Json": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.4"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "qZI42ASAe3hr2zMSA6UjM92pO1LeDq5DcwkgSowXXPY8I56M76pEKrnmsKKbxagAf39AJxkH2DY4sb72ixyOrg==",
+ "resolved": "9.0.4",
+ "contentHash": "f2MTUaS2EQ3lX4325ytPAISZqgBfXmY0WvgD80ji6Z20AoDNiCESxsqo6mFRwHJD/jfVKRw9FsW6+86gNre3ug==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "Tr74eP0oQ3AyC24ch17N8PuEkrPbD0JqIfENCYqmgKYNOmL8wQKzLJu3ObxTUDrjnn4rHoR1qKa37/eQyHmCDA=="
+ "resolved": "9.0.4",
+ "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "saxr2XzwgDU77LaQfYFXmddEDRUKHF4DaGMZkNB3qjdVSZlax3//dGJagJkKrGMIPNZs2jVFXITyCCR6UHJNdA==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "9.0.0",
+ "System.Text.Json": "9.0.0"
+ }
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "4ZmP6turxMFsNwK/MCko2fuIITaYYN/eXyyIRq1FjLDKnptdbn6xMb7u0zfSMzCGpzkx4RxH/g1jKN2IchG7uA==",
+ "resolved": "9.0.4",
+ "contentHash": "1bCSQrGv9+bpF5MGKF6THbnRFUZqQDrWPA39NDeVW9djeHBmow8kX4SX6/8KkeKI8gmUDG7jsG/bVuNAcY/ATQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4"
}
},
"Microsoft.Extensions.Diagnostics.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "pfAPuVtHvG6dvZtAa0OQbXdDqq6epnr8z0/IIUjdmV0tMeI8Aj9KxDXvdDvqr+qNHTkmA7pZpChNxwNZt4GXVg==",
+ "resolved": "9.0.4",
+ "contentHash": "IAucBcHYtiCmMyFag+Vrp5m+cjGRlDttJk9Vx7Dqpq+Ama4BzVUOk0JARQakgFFr7ZTBSgLKlHmtY5MiItB7Cg==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "System.Diagnostics.DiagnosticSource": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "System.Diagnostics.DiagnosticSource": "9.0.4"
}
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "DguZYt1DWL05+8QKWL3b6bW7A2pC5kYFMY5iXM6W2M23jhvcNa8v6AU8PvVJBcysxHwr9/jax0agnwoBumsSwg==",
+ "resolved": "9.0.4",
+ "contentHash": "gQN2o/KnBfVk6Bd71E2YsvO5lsqrqHmaepDGk+FB/C4aiQY9B0XKKNKfl5/TqcNOs9OEithm4opiMHAErMFyEw==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "TKDMNRS66UTMEVT38/tU9hA63UTMvzI3DyNm5mx8+JCf3BaOtxgrvWLCI1y3J52PzT5yNl/T2KN5Z0KbApLZcg==",
+ "resolved": "9.0.4",
+ "contentHash": "qkQ9V7KFZdTWNThT7ke7E/Jad38s46atSs3QUYZB8f3thBTrcrousdY4Y/tyCtcH5YjsPSiByjuN+L8W/ThMQg==",
"dependencies": {
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileSystemGlobbing": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileSystemGlobbing": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "Mxcp9NXuQMvAnudRZcgIb5SqlWrlullQzntBLTwuv0MPIJ5LqiGwbRqiyxgdk+vtCoUkplb0oXy5kAw1t469Ug=="
+ "resolved": "9.0.4",
+ "contentHash": "05Lh2ItSk4mzTdDWATW9nEcSybwprN8Tz42Fs5B+jwdXUpauktdAQUI1Am4sUQi2C63E5hvQp8gXvfwfg9mQGQ=="
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "CwSMhLNe8HLkfbFzdz0CHWJhtWH3TtfZSicLBd/itFD+NqQtfGHmvqXHQbaFFl3mQB5PBb2gxwzWQyW2pIj7PA==",
+ "resolved": "9.0.4",
+ "contentHash": "bXkwRPMo4x19YKH6/V9XotU7KYQJlihXhcWO1RDclAY3yfY3XNg4QtSEBvng4kK/DnboE0O/nwSl+6Jiv9P+FA==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.1",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.4",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "E/k5r7S44DOW+08xQPnNbO8DKAQHhkspDboTThNJ6Z3/QBb4LC6gStNWzVmy3IvW7sUD+iJKf4fj0xEkqE7vnQ==",
+ "resolved": "9.0.4",
+ "contentHash": "xW6QPYsqhbuWBO9/1oA43g/XPKbohJx+7G8FLQgQXIriYvY7s+gxr2wjQJfRoPO900dvvv2vVH7wZovG+M1m6w==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "w2gUqXN/jNIuvqYwX3lbXagsizVNXYyt6LlF57+tMve4JYCEgCMMAjRce6uKcDASJgpMbErRT1PfHy2OhbkqEA==",
+ "resolved": "9.0.4",
+ "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "System.Diagnostics.DiagnosticSource": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "System.Diagnostics.DiagnosticSource": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "MeZePlyu3/74Wk4FHYSzXijADJUhWa7gxtaphLxhS8zEPWdJuBCrPo0sezdCSZaKCL+cZLSLobrb7xt2zHOxZQ==",
+ "resolved": "9.0.4",
+ "contentHash": "/kF+rSnoo3/nIwGzWsR4RgBnoTOdZ3lzz2qFRyp/GgaNid4j6hOAQrs/O+QHXhlcAdZxjg37MvtIE+pAvIgi9g==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.1",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Binder": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.4",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "YUzguHYlWfp4upfYlpVe3dnY59P25wc+/YLJ9/NQcblT3EvAB1CObQulClll7NtnFbbx4Js0a0UfyS8SbRsWXQ==",
+ "resolved": "9.0.4",
+ "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging.Configuration": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "System.Text.Json": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "System.Text.Json": "9.0.4"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "pzdyibIV8k4sym0Sszcp2MJCuXrpOGs9qfOvY+hCRu8k4HbdVoeKOLnacxHK6vEPITX5o5FjjsZW2zScLXTjYA==",
+ "resolved": "9.0.4",
+ "contentHash": "D1jy+jy+huUUxnkZ0H480RZK8vqKn8NsQxYpMpPL/ALPPh1WATVLcr/uXI3RUBB45wMW5265O+hk9x3jnnXFuA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "+a4RlbwFWjsMujNNhf1Jy9Nm5CpMT+nxXxfgrkRSloPo0OAWhPSPsrFo6VWpvgIPPS41qmfAVWr3DqAmOoVZgQ==",
+ "resolved": "9.0.4",
+ "contentHash": "bApxdklf7QTsONOLR5ow6SdDFXR5ncHvumSEg2+QnCvxvkzc2z5kNn7yQCyupRLRN4jKbnlTkVX8x9qLlwL6Qg==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "System.Diagnostics.EventLog": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "System.Diagnostics.EventLog": "9.0.4"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "d47ZRZUOg1dGOX+yisWScQ7w4+92OlR9beS2UXaiadUCA3RFoZzobzVgrzBX7Oo/qefx9LxdRcaeFpWKb3BNBw==",
+ "resolved": "9.0.4",
+ "contentHash": "R600zTxVJNw2IeAEOvdOJGNA1lHr1m3vo460hSF5G1DjwP0FNpyeH4lpLDMuf34diKwB1LTt5hBw1iF1/iuwsQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Logging": "9.0.1",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1",
- "System.Text.Json": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Logging": "9.0.4",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4",
+ "System.Text.Json": "9.0.4"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "nggoNKnWcsBIAaOWHA+53XZWrslC7aGeok+aR+epDPRy7HI7GwMnGZE8yEsL2Onw7kMOHVHwKcsDls1INkNUJQ==",
+ "resolved": "9.0.4",
+ "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "8RRKWtuU4fR+8MQLR/8CqZwZ9yc2xCpllw/WPRY7kskIqEq0hMcEI4AfUJO72yGiK2QJkrsDcUvgB5Yc+3+lyg==",
+ "resolved": "9.0.4",
+ "contentHash": "aridVhAT3Ep+vsirR1pzjaOw0Jwiob6dc73VFQn2XmDfBA2X98M8YKO1GarvsXRX7gX1Aj+hj2ijMzrMHDOm0A==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
- "Microsoft.Extensions.Configuration.Binder": "9.0.1",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
- "Microsoft.Extensions.Options": "9.0.1",
- "Microsoft.Extensions.Primitives": "9.0.1"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4",
+ "Microsoft.Extensions.Options": "9.0.4",
+ "Microsoft.Extensions.Primitives": "9.0.4"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "bHtTesA4lrSGD1ZUaMIx6frU3wyy0vYtTa/hM6gGQu5QNrydObv8T5COiGUWsisflAfmsaFOe9Xvw5NSO99z0g=="
+ "resolved": "9.0.4",
+ "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA=="
},
"Serilog": {
"type": "Transitive",
@@ -374,39 +394,39 @@
},
"System.Diagnostics.DiagnosticSource": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "yOcDWx4P/s1I83+7gQlgQLmhny2eNcU0cfo1NBWi+en4EAI38Jau+/neT85gUW6w1s7+FUJc2qNOmmwGLIREqA=="
+ "resolved": "9.0.4",
+ "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "iVnDpgYJsRaRFnk77kcLA3+913WfWDtnAKrQl9tQ5ahqKANTaJKmQdsuPWWiAPWE9pk1Kj4Pg9JGXWfFYYyakQ=="
+ "resolved": "9.0.4",
+ "contentHash": "getRQEXD8idlpb1KW56XuxImMy0FKp2WJPDf3Qr0kI/QKxxJSftqfDFVo0DZ3HCJRLU73qHSruv5q2l5O47jQQ=="
},
"System.IO.Pipelines": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "uXf5o8eV/gtzDQY4lGROLFMWQvcViKcF8o4Q6KpIOjloAQXrnscQSu6gTxYJMHuNJnh7szIF9AzkaEq+zDLoEg=="
+ "resolved": "9.0.4",
+ "contentHash": "luF2Xba+lTe2GOoNQdZLe8q7K6s7nSpWZl9jIwWNMszN4/Yv0lmxk9HISgMmwdyZ83i3UhAGXaSY9o6IJBUuuA=="
},
"System.ServiceProcess.ServiceController": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "Ghm4yP29P3cC65Qof8CrgU3WO/q3ERtht6/CrvcUl1FgRs6D7exj75GuG4ciRv0sjygtvyd675924DFsxxnEgA==",
+ "resolved": "9.0.4",
+ "contentHash": "j6Z+ED1d/yxe/Cm+UlFf+LNw2HSYBSgtFh71KnEEmUtHIwgoTVQxji5URvXPOAZ7iuKHItjMIzpCLyRZc8OmrQ==",
"dependencies": {
- "System.Diagnostics.EventLog": "9.0.1"
+ "System.Diagnostics.EventLog": "9.0.4"
}
},
"System.Text.Encodings.Web": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "XkspqduP2t1e1x2vBUAD/xZ5ZDvmywuUwsmB93MvyQLospJfqtX0GsR/kU0vUL2h4kmvf777z3txV2W4NrQ9Qg=="
+ "resolved": "9.0.4",
+ "contentHash": "V+5cCPpk1S2ngekUs9nDrQLHGiWFZMg8BthADQr+Fwi59a8DdHFu26S2oi9Bfgv+d67bqmkPqctJXMEXiimXUg=="
},
"System.Text.Json": {
"type": "Transitive",
- "resolved": "9.0.1",
- "contentHash": "eqWHDZqYPv1PvuvoIIx5pF74plL3iEOZOl/0kQP+Y0TEbtgNnM2W6k8h8EPYs+LTJZsXuWa92n5W5sHTWvE3VA==",
+ "resolved": "9.0.4",
+ "contentHash": "pYtmpcO6R3Ef1XilZEHgXP2xBPVORbYEzRP7dl0IAAbN8Dm+kfwio8aCKle97rAWXOExr292MuxWYurIuwN62g==",
"dependencies": {
- "System.IO.Pipelines": "9.0.1",
- "System.Text.Encodings.Web": "9.0.1"
+ "System.IO.Pipelines": "9.0.4",
+ "System.Text.Encodings.Web": "9.0.4"
}
},
"Coder.Desktop.CoderSdk": {
diff --git a/scripts/Get-Mutagen.ps1 b/scripts/Get-Mutagen.ps1
index c540809..8689377 100644
--- a/scripts/Get-Mutagen.ps1
+++ b/scripts/Get-Mutagen.ps1
@@ -31,7 +31,7 @@ $goArch = switch ($arch) {
# Download the mutagen binary from our bucket for this platform if we don't have
# it yet (or it's different).
-$mutagenVersion = "v0.18.1"
+$mutagenVersion = "v0.18.3"
$mutagenPath = Join-Path $PSScriptRoot "files\mutagen-windows-$($arch).exe"
$mutagenUrl = "https://storage.googleapis.com/coder-desktop/mutagen/$($mutagenVersion)/mutagen-windows-$($goArch).exe"
$mutagenEtagFile = $mutagenPath + ".etag"
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy