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;