diff --git a/src/ImageSharp.Web.Providers.AWS/AmazonS3ClientFactory.cs b/src/ImageSharp.Web.Providers.AWS/AmazonS3ClientFactory.cs index d3589384..bbbf557c 100644 --- a/src/ImageSharp.Web.Providers.AWS/AmazonS3ClientFactory.cs +++ b/src/ImageSharp.Web.Providers.AWS/AmazonS3ClientFactory.cs @@ -14,13 +14,18 @@ internal static class AmazonS3ClientFactory /// with the same name does not already exist. /// /// The AWS S3 Storage cache options. + /// The current service provider. /// /// A new . /// /// Invalid configuration. - public static AmazonS3Client CreateClient(IAWSS3BucketClientOptions options) + public static AmazonS3Client CreateClient(IAWSS3BucketClientOptions options, IServiceProvider serviceProvider) { - if (!string.IsNullOrWhiteSpace(options.Endpoint)) + if (options.S3ClientProvider != null) + { + return options.S3ClientProvider(options, serviceProvider); + } + else if (!string.IsNullOrWhiteSpace(options.Endpoint)) { // AccessKey can be empty. // AccessSecret can be empty. diff --git a/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCache.cs b/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCache.cs index 676dbeca..4a5fea52 100644 --- a/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCache.cs +++ b/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCache.cs @@ -23,12 +23,13 @@ public class AWSS3StorageCache : IImageCache /// Initializes a new instance of the class. /// /// The cache options. - public AWSS3StorageCache(IOptions cacheOptions) + /// The current service provider. + public AWSS3StorageCache(IOptions cacheOptions, IServiceProvider serviceProvider) { Guard.NotNull(cacheOptions, nameof(cacheOptions)); AWSS3StorageCacheOptions options = cacheOptions.Value; this.bucketName = options.BucketName; - this.amazonS3Client = AmazonS3ClientFactory.CreateClient(options); + this.amazonS3Client = AmazonS3ClientFactory.CreateClient(options, serviceProvider); this.cacheFolder = string.IsNullOrEmpty(options.CacheFolder) ? string.Empty : options.CacheFolder.Trim().Trim('/') + '/'; @@ -82,20 +83,23 @@ public Task SetAsync(string key, Stream stream, ImageCacheMetadata metadata) /// and object data. specifies that the bucket /// data is private to the account owner. /// + /// The current service provider. /// /// If the bucket does not already exist, a describing the newly /// created bucket. If the container already exists, . /// public static PutBucketResponse? CreateIfNotExists( AWSS3StorageCacheOptions options, - S3CannedACL acl) - => AsyncHelper.RunSync(() => CreateIfNotExistsAsync(options, acl)); + S3CannedACL acl, + IServiceProvider serviceProvider) + => AsyncHelper.RunSync(() => CreateIfNotExistsAsync(options, acl, serviceProvider)); private static async Task CreateIfNotExistsAsync( AWSS3StorageCacheOptions options, - S3CannedACL acl) + S3CannedACL acl, + IServiceProvider serviceProvider) { - AmazonS3Client client = AmazonS3ClientFactory.CreateClient(options); + AmazonS3Client client = AmazonS3ClientFactory.CreateClient(options, serviceProvider); bool foundBucket = false; ListBucketsResponse listBucketsResponse = await client.ListBucketsAsync(); diff --git a/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCacheOptions.cs b/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCacheOptions.cs index f10f1a47..68d5c94c 100644 --- a/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCacheOptions.cs +++ b/src/ImageSharp.Web.Providers.AWS/Caching/AWSS3StorageCacheOptions.cs @@ -1,6 +1,8 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. +using Amazon.S3; + namespace SixLabors.ImageSharp.Web.Caching.AWS; /// @@ -8,6 +10,9 @@ namespace SixLabors.ImageSharp.Web.Caching.AWS; /// public class AWSS3StorageCacheOptions : IAWSS3BucketClientOptions { + /// + public Func? S3ClientProvider { get; set; } = null!; + /// public string? Region { get; set; } diff --git a/src/ImageSharp.Web.Providers.AWS/IAWSS3BucketClientOptions.cs b/src/ImageSharp.Web.Providers.AWS/IAWSS3BucketClientOptions.cs index 1d15448d..25310fa3 100644 --- a/src/ImageSharp.Web.Providers.AWS/IAWSS3BucketClientOptions.cs +++ b/src/ImageSharp.Web.Providers.AWS/IAWSS3BucketClientOptions.cs @@ -1,13 +1,20 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. +using Amazon.S3; + namespace SixLabors.ImageSharp.Web; /// /// Provides a common interface for AWS S3 Bucket Client Options. /// -internal interface IAWSS3BucketClientOptions +public interface IAWSS3BucketClientOptions { + /// + /// Gets or sets a custom Azure AmazonS3Client provider + /// + Func? S3ClientProvider { get; set; } + /// /// Gets or sets the AWS region endpoint (us-east-1/us-west-1/ap-southeast-2). /// diff --git a/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProvider.cs b/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProvider.cs index 397f54c6..4c3d5b24 100644 --- a/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProvider.cs +++ b/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProvider.cs @@ -40,7 +40,8 @@ private readonly Dictionary buckets /// /// The S3 storage options /// Contains various format helper methods based on the current configuration. - public AWSS3StorageImageProvider(IOptions storageOptions, FormatUtilities formatUtilities) + /// The current service provider. + public AWSS3StorageImageProvider(IOptions storageOptions, FormatUtilities formatUtilities, IServiceProvider serviceProvider) { Guard.NotNull(storageOptions, nameof(storageOptions)); @@ -50,7 +51,7 @@ public AWSS3StorageImageProvider(IOptions stor foreach (AWSS3BucketClientOptions bucket in this.storageOptions.S3Buckets) { - this.buckets.Add(bucket.BucketName, AmazonS3ClientFactory.CreateClient(bucket)); + this.buckets.Add(bucket.BucketName, AmazonS3ClientFactory.CreateClient(bucket, serviceProvider)); } } diff --git a/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProviderOptions.cs b/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProviderOptions.cs index f0c3a201..00c97a53 100644 --- a/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProviderOptions.cs +++ b/src/ImageSharp.Web.Providers.AWS/Providers/AWSS3StorageImageProviderOptions.cs @@ -1,6 +1,8 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. +using Amazon.S3; + namespace SixLabors.ImageSharp.Web.Providers.AWS; /// @@ -19,6 +21,9 @@ public class AWSS3StorageImageProviderOptions /// public class AWSS3BucketClientOptions : IAWSS3BucketClientOptions { + /// + public Func? S3ClientProvider { get; set; } = null!; + /// public string? Region { get; set; } diff --git a/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheCacheFolderTestServerFixture.cs b/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheCacheFolderTestServerFixture.cs index d452ef6b..89c7726d 100644 --- a/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheCacheFolderTestServerFixture.cs +++ b/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheCacheFolderTestServerFixture.cs @@ -35,7 +35,7 @@ protected override void ConfigureCustomServices(IServiceCollection services, IIm o.Timeout = TestConstants.AWSTimeout; o.CacheFolder = TestConstants.AWSCacheFolder; - AWSS3StorageCache.CreateIfNotExists(o, S3CannedACL.Private); + AWSS3StorageCache.CreateIfNotExists(o, S3CannedACL.Private, services.BuildServiceProvider()); }) .SetCache(); } diff --git a/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheTestServerFixture.cs b/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheTestServerFixture.cs index cb016f22..c3ac3ac8 100644 --- a/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheTestServerFixture.cs +++ b/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageCacheTestServerFixture.cs @@ -34,7 +34,7 @@ protected override void ConfigureCustomServices(IServiceCollection services, IIm o.Region = TestConstants.AWSRegion; o.Timeout = TestConstants.AWSTimeout; - AWSS3StorageCache.CreateIfNotExists(o, S3CannedACL.Private); + AWSS3StorageCache.CreateIfNotExists(o, S3CannedACL.Private, services.BuildServiceProvider()); }) .SetCache(); } diff --git a/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageImageProviderFactory.cs b/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageImageProviderFactory.cs index bbfb8a5d..78d08112 100644 --- a/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageImageProviderFactory.cs +++ b/tests/ImageSharp.Web.Tests/TestUtilities/AWSS3StorageImageProviderFactory.cs @@ -20,14 +20,14 @@ public static AWSS3StorageImageProvider Create(IServiceProvider services) FormatUtilities utilities = services.GetRequiredService(); AsyncHelper.RunSync(() => InitializeAWSStorageAsync(services, options.Value)); - return new AWSS3StorageImageProvider(options, utilities); + return new AWSS3StorageImageProvider(options, utilities, services); } private static async Task InitializeAWSStorageAsync(IServiceProvider services, AWSS3StorageImageProviderOptions options) { // Upload an image to the AWS Test Storage; AWSS3BucketClientOptions bucketOptions = options.S3Buckets.First(); - AmazonS3Client amazonS3Client = AmazonS3ClientFactory.CreateClient(bucketOptions); + AmazonS3Client amazonS3Client = AmazonS3ClientFactory.CreateClient(bucketOptions, services); ListBucketsResponse listBucketsResponse = await amazonS3Client.ListBucketsAsync(); bool foundBucket = false;