Browse Source

Fix download exceptions when ignoring errors (#853)

Next Turn 4 years ago
parent
commit
71f08e5e73
3 changed files with 11 additions and 31 deletions
  1. 6 2
      src/WinSW.Core/Download.cs
  2. 1 26
      src/WinSW.Core/WrapperService.cs
  3. 4 3
      src/WinSW.Tests/DownloadTests.cs

+ 6 - 2
src/WinSW.Core/Download.cs

@@ -193,10 +193,14 @@ namespace WinSW
                 if (supportsIfModifiedSince && ((HttpWebResponse?)e.Response)?.StatusCode == HttpStatusCode.NotModified)
                 {
                     Logger.Info($"Skipped downloading unmodified resource '{this.From}'");
+                    return;
                 }
-                else
+
+                string errorMessage = $"Failed to download {this.From} to {this.To}";
+                Logger.Error(errorMessage, e);
+                if (this.FailOnError)
                 {
-                    throw;
+                    throw new IOException(errorMessage, e);
                 }
             }
         }

+ 1 - 26
src/WinSW.Core/WrapperService.cs

@@ -272,32 +272,7 @@ namespace WinSW
                 tasks[i] = download.PerformAsync();
             }
 
-            try
-            {
-                Task.WaitAll(tasks);
-            }
-            catch (AggregateException e)
-            {
-                var exceptions = new List<Exception>(e.InnerExceptions.Count);
-                for (int i = 0; i < tasks.Length; i++)
-                {
-                    if (tasks[i].IsFaulted)
-                    {
-                        var download = downloads[i];
-                        string errorMessage = $"Failed to download {download.From} to {download.To}";
-                        var exception = tasks[i].Exception!;
-                        Log.Error(errorMessage, exception);
-
-                        // TODO: move this code into the download logic
-                        if (download.FailOnError)
-                        {
-                            exceptions.Add(new IOException(errorMessage, exception));
-                        }
-                    }
-                }
-
-                throw new AggregateException(exceptions);
-            }
+            Task.WaitAll(tasks);
 
             var sharedDirectories = this.config.SharedDirectories;
             if (sharedDirectories.Count > 0)

+ 4 - 3
src/WinSW.Tests/DownloadTests.cs

@@ -210,10 +210,11 @@ namespace WinSW.Tests
             await this.TestClientServerAsync(
                 async (source, dest) =>
                 {
-                    var exception = await Assert.ThrowsAsync<WebException>(
-                        async () => await new Download(source, dest).PerformAsync());
+                    var exception = await Assert.ThrowsAsync<IOException>(
+                        async () => await new Download(source, dest, true).PerformAsync());
 
-                    Assert.Equal(WebExceptionStatus.ProtocolError, exception.Status);
+                    var inner = Assert.IsType<WebException>(exception.InnerException);
+                    Assert.Equal(WebExceptionStatus.ProtocolError, inner.Status);
                 },
                 context =>
                 {