From 2e46392e2d254488b9297949863c517f465ed62f Mon Sep 17 00:00:00 2001 From: Ramon de Klein Date: Thu, 27 Jun 2024 12:20:11 +0200 Subject: [PATCH] Fix #1115 (#1116) --- Minio/ApiEndpoints/CompatibilityExtensions.cs | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/Minio/ApiEndpoints/CompatibilityExtensions.cs b/Minio/ApiEndpoints/CompatibilityExtensions.cs index 0c5621b8..bcf21005 100644 --- a/Minio/ApiEndpoints/CompatibilityExtensions.cs +++ b/Minio/ApiEndpoints/CompatibilityExtensions.cs @@ -9,12 +9,27 @@ public static class CompatibilityExtensions // Used for backwards compatibility [Obsolete("Use the ListObjectsEnumAsync instead")] public static IObservable ListObjectsAsync(this IBucketOperations self, ListObjectsArgs args) + { + return self.InternalListObjectsAsync(args, CancellationToken.None); + } + + // Used for backwards compatibility (with added warning) + [Obsolete("Use the ListObjectsEnumAsync instead (also don't mix cancellation tokens and observables)")] + public static IObservable ListObjectsAsync(this IBucketOperations self, ListObjectsArgs args, + CancellationToken cancellationToken) + { + return self.InternalListObjectsAsync(args, cancellationToken); + } + + private static IObservable InternalListObjectsAsync(this IBucketOperations self, ListObjectsArgs args, + CancellationToken cancellationToken) { return Observable.Create(async (obs, ct) => { try { - await foreach (var item in self.ListObjectsEnumAsync(args, ct).ConfigureAwait(false)) + using var ctEffective = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, ct); + await foreach (var item in self.ListObjectsEnumAsync(args, ctEffective.Token).ConfigureAwait(false)) obs.OnNext(item); obs.OnCompleted(); } @@ -26,14 +41,30 @@ await foreach (var item in self.ListObjectsEnumAsync(args, ct).ConfigureAwait(fa } // Used for backwards compatibility - [Obsolete("Use the ListIncompleteUploadsEnumAsync instead")] + [Obsolete("Use the ListObjectsEnumAsync instead")] public static IObservable ListIncompleteUploads(this IObjectOperations self, ListIncompleteUploadsArgs args) + { + return self.InternalListIncompleteUploads(args, CancellationToken.None); + } + + // Used for backwards compatibility (with added warning) + [Obsolete("Use the ListIncompleteUploads instead (also don't mix cancellation tokens and observables)")] + public static IObservable ListIncompleteUploads(this IObjectOperations self, ListIncompleteUploadsArgs args, + CancellationToken cancellationToken) + { + return self.InternalListIncompleteUploads(args, cancellationToken); + } + + private static IObservable InternalListIncompleteUploads(this IObjectOperations self, + ListIncompleteUploadsArgs args, CancellationToken cancellationToken = default) { return Observable.Create(async (obs, ct) => { try { - await foreach (var item in self.ListIncompleteUploadsEnumAsync(args, ct).ConfigureAwait(false)) + using var ctEffective = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, ct); + await foreach (var item in self.ListIncompleteUploadsEnumAsync(args, ctEffective.Token) + .ConfigureAwait(false)) obs.OnNext(item); obs.OnCompleted(); }