From aab49bc8e58fb17d311b8a8143faafb0c246d520 Mon Sep 17 00:00:00 2001 From: frabe1579 Date: Mon, 7 Nov 2022 09:58:27 +0100 Subject: [PATCH 1/4] Throw S3FileStorageException when something goes wrong and response is not as expected for GetFileStreamAsync, GetFileInfoAsync, and ExistsAsync. --- src/Foundatio.AWS/Storage/S3FileStorage.cs | 26 +++++++++++++------ .../Storage/S3FileStorageException.cs | 16 ++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 src/Foundatio.AWS/Storage/S3FileStorageException.cs diff --git a/src/Foundatio.AWS/Storage/S3FileStorage.cs b/src/Foundatio.AWS/Storage/S3FileStorage.cs index 3587138..7e70918 100644 --- a/src/Foundatio.AWS/Storage/S3FileStorage.cs +++ b/src/Foundatio.AWS/Storage/S3FileStorage.cs @@ -11,6 +11,7 @@ using Amazon.S3.Model; using Amazon.S3.Util; using Foundatio.AWS.Extensions; +using Foundatio.AWS.Storage; using Foundatio.Extensions; using Foundatio.Serializer; using Microsoft.Extensions.Logging; @@ -54,7 +55,7 @@ public S3FileStorage(Builder : this(builder(new S3FileStorageOptionsBuilder()).Build()) { } ISerializer IHaveSerializer.Serializer => _serializer; - + public AmazonS3Client Client => _client; public string Bucket => _bucket; public S3CannedACL CannedACL => _cannedAcl; @@ -69,9 +70,13 @@ public S3FileStorage(Builder }; var res = await _client.GetObjectAsync(req, cancellationToken).AnyContext(); - if (!res.HttpStatusCode.IsSuccessful()) + + if (res.HttpStatusCode == System.Net.HttpStatusCode.NotFound) return null; + if (res.HttpStatusCode != System.Net.HttpStatusCode.OK) + throw new S3FileStorageException($"Invalid status code, expected 200 OK, found {(int)res.HttpStatusCode} {res.HttpStatusCode}."); + return new ActionableStream(res.ResponseStream, () => { res?.Dispose(); }); @@ -89,17 +94,22 @@ public async Task GetFileInfoAsync(string path) { try { var res = await _client.GetObjectMetadataAsync(req).AnyContext(); - if (!res.HttpStatusCode.IsSuccessful()) + if (res.HttpStatusCode == System.Net.HttpStatusCode.NotFound) return null; + if (res.HttpStatusCode != System.Net.HttpStatusCode.OK) + throw new S3FileStorageException($"Invalid status code, expected 200 OK, found {(int)res.HttpStatusCode} {res.HttpStatusCode}."); + return new FileSpec { Size = res.ContentLength, Created = res.LastModified.ToUniversalTime(), // TODO: Need to fix this Modified = res.LastModified.ToUniversalTime(), Path = path }; - } catch (AmazonS3Exception) { - return null; + } catch (AmazonS3Exception ex) { + if (ex.StatusCode == System.Net.HttpStatusCode.NotFound) + return null; + throw new S3FileStorageException("Error accessing S3 storage: " + ex.Message, ex); } } @@ -209,7 +219,7 @@ public async Task ExistsAsync(string path) { continue; deleteRequest.Objects.AddRange(keys); - + var deleteResponse = await _client.DeleteObjectsAsync(deleteRequest, cancellationToken).AnyContext(); if (deleteResponse.DeleteErrors.Count > 0) { // retry 1 time, continue on. @@ -259,9 +269,9 @@ private async Task GetFiles(SearchCriteria criteria, int pageSiz Files = response.S3Objects.MatchesPattern(criteria.Pattern).Select(blob => blob.ToFileInfo()).ToList(), NextPageFunc = response.IsTruncated ? r => GetFiles(criteria, pageSize, cancellationToken, response.NextContinuationToken) : (Func>)null }; - } + } - private class SearchCriteria { + private class SearchCriteria { public string Prefix { get; set; } public Regex Pattern { get; set; } } diff --git a/src/Foundatio.AWS/Storage/S3FileStorageException.cs b/src/Foundatio.AWS/Storage/S3FileStorageException.cs new file mode 100644 index 0000000..473f212 --- /dev/null +++ b/src/Foundatio.AWS/Storage/S3FileStorageException.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Foundatio.AWS.Storage { + public class S3FileStorageException : Exception { + public S3FileStorageException() : base() { + } + + public S3FileStorageException(string message) : base(message) { + } + + public S3FileStorageException(string message, Exception innerException) : base(message, innerException) { + } + } +} From 38539452b432cadc8ab562d7018da16ebb9719b6 Mon Sep 17 00:00:00 2001 From: Francesco Benetton <9257757+frabe1579@users.noreply.github.com> Date: Mon, 7 Nov 2022 16:32:38 +0100 Subject: [PATCH 2/4] Update src/Foundatio.AWS/Storage/S3FileStorage.cs Co-authored-by: Blake Niemyjski --- src/Foundatio.AWS/Storage/S3FileStorage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Foundatio.AWS/Storage/S3FileStorage.cs b/src/Foundatio.AWS/Storage/S3FileStorage.cs index 7e70918..0798dd1 100644 --- a/src/Foundatio.AWS/Storage/S3FileStorage.cs +++ b/src/Foundatio.AWS/Storage/S3FileStorage.cs @@ -98,7 +98,7 @@ public async Task GetFileInfoAsync(string path) { return null; if (res.HttpStatusCode != System.Net.HttpStatusCode.OK) - throw new S3FileStorageException($"Invalid status code, expected 200 OK, found {(int)res.HttpStatusCode} {res.HttpStatusCode}."); + throw new S3FileStorageException($"Invalid status code {res.HttpStatusCode} ({(int)res.HttpStatusCode}): Expected 200 OK"); return new FileSpec { Size = res.ContentLength, From de7a5efc24735130a04d7cffea44df8f3bfa80c4 Mon Sep 17 00:00:00 2001 From: frabe1579 Date: Mon, 7 Nov 2022 16:37:48 +0100 Subject: [PATCH 3/4] Use exception filter when possible --- src/Foundatio.AWS/Storage/S3FileStorage.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Foundatio.AWS/Storage/S3FileStorage.cs b/src/Foundatio.AWS/Storage/S3FileStorage.cs index 7e70918..8306be3 100644 --- a/src/Foundatio.AWS/Storage/S3FileStorage.cs +++ b/src/Foundatio.AWS/Storage/S3FileStorage.cs @@ -106,10 +106,8 @@ public async Task GetFileInfoAsync(string path) { Modified = res.LastModified.ToUniversalTime(), Path = path }; - } catch (AmazonS3Exception ex) { - if (ex.StatusCode == System.Net.HttpStatusCode.NotFound) - return null; - throw new S3FileStorageException("Error accessing S3 storage: " + ex.Message, ex); + } catch (AmazonS3Exception ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound) { + return null; } } From 0907c2881be13a9ca5d1358e2ee73b6a6d7a4c1b Mon Sep 17 00:00:00 2001 From: frabe1579 Date: Mon, 7 Nov 2022 16:47:13 +0100 Subject: [PATCH 4/4] Unified S3FileStorageException messages --- src/Foundatio.AWS/Storage/S3FileStorage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Foundatio.AWS/Storage/S3FileStorage.cs b/src/Foundatio.AWS/Storage/S3FileStorage.cs index c07edf9..dc4867e 100644 --- a/src/Foundatio.AWS/Storage/S3FileStorage.cs +++ b/src/Foundatio.AWS/Storage/S3FileStorage.cs @@ -75,7 +75,7 @@ public S3FileStorage(Builder return null; if (res.HttpStatusCode != System.Net.HttpStatusCode.OK) - throw new S3FileStorageException($"Invalid status code, expected 200 OK, found {(int)res.HttpStatusCode} {res.HttpStatusCode}."); + throw new S3FileStorageException($"Invalid status code {res.HttpStatusCode} ({(int)res.HttpStatusCode}): Expected 200 OK"); return new ActionableStream(res.ResponseStream, () => { res?.Dispose();