From 0bd331bde497930a9ef2e6f1ee7eb3341732b60c Mon Sep 17 00:00:00 2001 From: Adam Cox Date: Tue, 12 Feb 2019 15:01:54 -0500 Subject: [PATCH] change error handling to provide warning on file prepare issues instead of exiting completely --- FeedBuilder/FeedBuilder.csproj | 5 +- .../NAppUpdate.Framework.csproj | 4 + .../Resources.Designer.cs | 5 +- .../Sources/IUpdateSource.cs | 2 +- .../Sources/MemorySource.cs | 12 +-- .../Sources/SimpleWebSource.cs | 13 ++- src/NAppUpdate.Framework/Sources/UncSource.cs | 3 +- .../Tasks/FileUpdateTask.cs | 14 ++- src/NAppUpdate.Framework/UpdateManager.cs | 6 +- src/NAppUpdate.Framework/Updater/updater.exe | Bin 82432 -> 81920 bytes .../Utils/FileDownloader.cs | 97 +++++++++++------- 11 files changed, 101 insertions(+), 60 deletions(-) diff --git a/FeedBuilder/FeedBuilder.csproj b/FeedBuilder/FeedBuilder.csproj index 235b7d20..85d03134 100644 --- a/FeedBuilder/FeedBuilder.csproj +++ b/FeedBuilder/FeedBuilder.csproj @@ -6,7 +6,7 @@ 2.0 {734FA44E-39AC-478E-A5AA-0F3D1F1974AA} - Exe + WinExe FeedBuilder.Program FeedBuilder FeedBuilder @@ -51,7 +51,8 @@ On - component.ico + + true diff --git a/src/NAppUpdate.Framework/NAppUpdate.Framework.csproj b/src/NAppUpdate.Framework/NAppUpdate.Framework.csproj index 2fb2acd1..36b38b33 100644 --- a/src/NAppUpdate.Framework/NAppUpdate.Framework.csproj +++ b/src/NAppUpdate.Framework/NAppUpdate.Framework.csproj @@ -34,6 +34,10 @@ false true + SAK + SAK + SAK + SAK true diff --git a/src/NAppUpdate.Framework/Resources.Designer.cs b/src/NAppUpdate.Framework/Resources.Designer.cs index 062e58c8..34685ab4 100644 --- a/src/NAppUpdate.Framework/Resources.Designer.cs +++ b/src/NAppUpdate.Framework/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.17379 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -60,6 +60,9 @@ internal Resources() { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// internal static byte[] updater { get { object obj = ResourceManager.GetObject("updater", resourceCulture); diff --git a/src/NAppUpdate.Framework/Sources/IUpdateSource.cs b/src/NAppUpdate.Framework/Sources/IUpdateSource.cs index c32480f2..64ef3e54 100644 --- a/src/NAppUpdate.Framework/Sources/IUpdateSource.cs +++ b/src/NAppUpdate.Framework/Sources/IUpdateSource.cs @@ -6,6 +6,6 @@ namespace NAppUpdate.Framework.Sources public interface IUpdateSource { string GetUpdatesFeed(); // TODO: return a the feed as a stream - bool GetData(string filePath, string basePath, Action onProgress, ref string tempLocation); + void GetData(string filePath, string basePath, Action onProgress, ref string tempLocation); } } diff --git a/src/NAppUpdate.Framework/Sources/MemorySource.cs b/src/NAppUpdate.Framework/Sources/MemorySource.cs index 906b731f..67bcf68f 100644 --- a/src/NAppUpdate.Framework/Sources/MemorySource.cs +++ b/src/NAppUpdate.Framework/Sources/MemorySource.cs @@ -28,7 +28,7 @@ public string GetUpdatesFeed() return Feed; } - public bool GetData(string filePath, string basePath, Action onProgress, ref string tempFile) + public void GetData(string filePath, string basePath, Action onProgress, ref string tempFile) { Uri uriKey = null; @@ -37,12 +37,12 @@ public bool GetData(string filePath, string basePath, Action else if (Uri.IsWellFormedUriString(basePath, UriKind.Absolute)) uriKey = new Uri(new Uri(basePath, UriKind.Absolute), filePath); - if (uriKey == null || !tempFiles.ContainsKey(uriKey)) - return false; + if (uriKey == null) + throw new ApplicationException($"Unable to create Uri where filePath is '{filePath}' and basePath is '{basePath}'"); + if (!tempFiles.ContainsKey(uriKey)) + throw new ApplicationException($"Uri '${uriKey}' not found in tempFiles"); - tempFile = tempFiles[uriKey]; - - return true; + tempFile = tempFiles[uriKey]; } #endregion diff --git a/src/NAppUpdate.Framework/Sources/SimpleWebSource.cs b/src/NAppUpdate.Framework/Sources/SimpleWebSource.cs index 727e7a14..d458a051 100644 --- a/src/NAppUpdate.Framework/Sources/SimpleWebSource.cs +++ b/src/NAppUpdate.Framework/Sources/SimpleWebSource.cs @@ -64,7 +64,7 @@ public string GetUpdatesFeed() return data; } - public bool GetData(string url, string baseUrl, Action onProgress, ref string tempLocation) + public void GetData(string url, string baseUrl, Action onProgress, ref string tempLocation) { FileDownloader fd; // A baseUrl of http://testserver/somefolder with a file linklibrary.dll was resulting in a webrequest to http://testserver/linklibrary @@ -85,8 +85,15 @@ public bool GetData(string url, string baseUrl, Action onPro // files requiring pre-processing tempLocation = Path.GetTempFileName(); - return fd.DownloadToFile(tempLocation, onProgress); - } + try + { + fd.DownloadToFile(tempLocation, onProgress); + } + catch (Exception ex) + { + throw new ApplicationException($"An error occurred while downloading file '{(fd as FileDownloader).Uri.ToString()}'. {ex.Message}"); + } + } #endregion } diff --git a/src/NAppUpdate.Framework/Sources/UncSource.cs b/src/NAppUpdate.Framework/Sources/UncSource.cs index 54250b5f..cf6f44d7 100644 --- a/src/NAppUpdate.Framework/Sources/UncSource.cs +++ b/src/NAppUpdate.Framework/Sources/UncSource.cs @@ -50,7 +50,7 @@ public string GetUpdatesFeed() return data; } - public bool GetData(string filePath, string basePath, Action onProgress, ref string tempLocation) + public void GetData(string filePath, string basePath, Action onProgress, ref string tempLocation) { if (basePath == null) { @@ -62,7 +62,6 @@ public bool GetData(string filePath, string basePath, Action } File.Copy(basePath + filePath, tempLocation); - return true; } } } diff --git a/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs b/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs index 3830f2bf..5a217917 100644 --- a/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs +++ b/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs @@ -49,10 +49,16 @@ public override void Prepare(Sources.IUpdateSource source) UpdateManager.Instance.Logger.Log("FileUpdateTask: Downloading {0} with BaseUrl of {1} to {2}", fileName, baseUrl, tempFileLocal); - if (!source.GetData(fileName, baseUrl, OnProgress, ref tempFileLocal)) - throw new UpdateProcessFailedException("FileUpdateTask: Failed to get file from source"); - - _tempFile = tempFileLocal; + try + { + source.GetData(fileName, baseUrl, OnProgress, ref tempFileLocal); + } + catch (Exception ex) + { + throw new UpdateProcessFailedException($"FileUpdateTask: Failed to get file from source. {ex.Message}"); + } + + _tempFile = tempFileLocal; if (_tempFile == null) throw new UpdateProcessFailedException("FileUpdateTask: Failed to get file from source"); diff --git a/src/NAppUpdate.Framework/UpdateManager.cs b/src/NAppUpdate.Framework/UpdateManager.cs index 87295096..1b071b53 100644 --- a/src/NAppUpdate.Framework/UpdateManager.cs +++ b/src/NAppUpdate.Framework/UpdateManager.cs @@ -246,11 +246,11 @@ public void PrepareUpdates() catch (Exception ex) { task.ExecutionStatus = TaskExecutionStatus.FailedToPrepare; - Logger.Log(ex); - throw new UpdateProcessFailedException("Failed to prepare task: " + task.Description, ex); + Logger.Log(Logger.SeverityLevel.Warning, $"Error while preparing file with LocalPath '{(task as FileUpdateTask).LocalPath}'. {ex.Message}"); } + Logger.Dump(); - task.ExecutionStatus = TaskExecutionStatus.Prepared; + task.ExecutionStatus = TaskExecutionStatus.Prepared; } State = UpdateProcessState.Prepared; diff --git a/src/NAppUpdate.Framework/Updater/updater.exe b/src/NAppUpdate.Framework/Updater/updater.exe index 94c4caa219213287b6920dade96fbe8b98d35156..36cf621614263c67e732d99d4ab4f012f933956c 100644 GIT binary patch delta 9070 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≪W8avk69Tr8qyGIW*Zj>K}%Mxg5meGsdI4W%KPjXu= z(H&-g3TupKTfls*e~a*kSCGSRHoLZrMwwGMD6^e-k(mZ2Hd7ByU@;O!ibIZDY&Bz9 zy^-$8y>iZY9EC!?eHd90?Tp}v8W3EuN-kQ&GvJ)79N|5a+i2=fneAQCxUr=6w%g|`iW_;5`95?W6r3~V z(gcX-5q|vi8culavI!-PqEGXL^K)zTFl=|8K$9Zl?K`k*aL!@X-QwZa9$$Io(N&Y) z_oQ=A_J4HKiUTc&&bcO)Mgl)1^@*J~tSp&+W=K{7e)XjbFJ1WFch{^0q2rT>PYJ$C zNs5Gb9?XSrfSQ80?pk@7ieLTpav=C}zycL=h$L5tF$svq5e*0iP{5x9s$9cZO_N)~ zgrCPrQ$i9e3smtNOh}6AFlwAz9j0x>=SqC?xs806$^n0R=hpPCd=1>LQTL#qu(!V14Cf{GY&~ z!*K+PX%d1cP))-`n0HWD`MN*HP_J7Ktb!SC1XZE&sz4N+s(>yJzND3vA%o>S)(9{d zxCzT;F1Ms2tV~mLkf_0ORG6kde(i>|{;GGjoj0v-%tL&}z+jtm>#)matnu*K2iM`h z{Xf%R$ZNz4k_NmKVcD;V_Vd%ji};tj;lC4+fR~|eCccW#6GY3~o7*RJPBb2$phph< zdF{a`TlZeg%c^Vk4c*4J8%DqPO|?soRoe589k=JPqCijfPd~WnT^tYXt0gHuO5~C{Q|&yM5|7 zik$&D4r0cF>i}%;eWN+s- zQa!l*gTJZSUoeZEWY_Qi9IptW&@r2tIYMFobF@~ diff --git a/src/NAppUpdate.Framework/Utils/FileDownloader.cs b/src/NAppUpdate.Framework/Utils/FileDownloader.cs index 4aba92f5..477dd609 100644 --- a/src/NAppUpdate.Framework/Utils/FileDownloader.cs +++ b/src/NAppUpdate.Framework/Utils/FileDownloader.cs @@ -12,6 +12,14 @@ public sealed class FileDownloader private const int _bufferSize = 1024; public IWebProxy Proxy { get; set; } + public Uri Uri + { + get + { + return _uri; + } + } + public FileDownloader() { Proxy = null; @@ -33,46 +41,59 @@ public byte[] Download() return client.DownloadData(_uri); } - public bool DownloadToFile(string tempLocation) - { - return DownloadToFile(tempLocation, null); - } + public void DownloadToFile(string tempLocation) + { + DownloadToFile(tempLocation, null); + } - public bool DownloadToFile(string tempLocation, Action onProgress) + public void DownloadToFile(string tempLocation, Action onProgress) { - var request = WebRequest.Create(_uri); - request.Proxy = Proxy; - - using (var response = request.GetResponse()) - using (var tempFile = File.Create(tempLocation)) - { - using (var responseStream = response.GetResponseStream()) - { - if (responseStream == null) - return false; - - long downloadSize = response.ContentLength; - long totalBytes = 0; - var buffer = new byte[_bufferSize]; - const int reportInterval = 1; - DateTime stamp = DateTime.Now.Subtract(new TimeSpan(0, 0, reportInterval)); - int bytesRead; - do - { - bytesRead = responseStream.Read(buffer, 0, buffer.Length); - totalBytes += bytesRead; - tempFile.Write(buffer, 0, bytesRead); - - if (onProgress == null || !(DateTime.Now.Subtract(stamp).TotalSeconds >= reportInterval)) continue; - ReportProgress(onProgress, totalBytes, downloadSize); - stamp = DateTime.Now; - } while (bytesRead > 0 && !UpdateManager.Instance.ShouldStop); - - ReportProgress(onProgress, totalBytes, downloadSize); - return totalBytes == downloadSize; - } - } - } + var request = WebRequest.Create(_uri); + request.Proxy = Proxy; + + try + { + using (var response = request.GetResponse()) + using (var tempFile = File.Create(tempLocation)) + { + using (var responseStream = response.GetResponseStream()) + { + if (responseStream == null) + throw new ApplicationException($"Unable to get response stream to file at uri '{_uri}'"); + + long downloadSize = response.ContentLength; + long totalBytes = 0; + var buffer = new byte[_bufferSize]; + const int reportInterval = 1; + DateTime stamp = DateTime.Now.Subtract(new TimeSpan(0, 0, reportInterval)); + int bytesRead; + do + { + bytesRead = responseStream.Read(buffer, 0, buffer.Length); + totalBytes += bytesRead; + tempFile.Write(buffer, 0, bytesRead); + + if (onProgress == null || !(DateTime.Now.Subtract(stamp).TotalSeconds >= reportInterval)) continue; + ReportProgress(onProgress, totalBytes, downloadSize); + stamp = DateTime.Now; + } while (bytesRead > 0 && !UpdateManager.Instance.ShouldStop); + + ReportProgress(onProgress, totalBytes, downloadSize); + + if (totalBytes != downloadSize) + throw new ApplicationException($"File at uri '{_uri}' did not fully download"); + } + } + } + catch (WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound) + { + throw new ApplicationException($"Unable to download file at '{_uri}'. {ex.Message}"); + } + catch (Exception ex) + { + throw new ApplicationException($"Unable to download file at '{_uri}'. {ex.Message}"); + } + } private void ReportProgress(Action onProgress, long totalBytes, long downloadSize) {