diff --git a/Minio.Functional.Tests/FunctionalTest.cs b/Minio.Functional.Tests/FunctionalTest.cs index 91a697fae..1048bfa21 100644 --- a/Minio.Functional.Tests/FunctionalTest.cs +++ b/Minio.Functional.Tests/FunctionalTest.cs @@ -594,8 +594,7 @@ internal static async Task TearDown(IMinioClient minio, string bucketName) ObjectLockConfiguration lockConfig = null; try { - VersioningConfiguration versioningConfig = null; - versioningConfig = await minio.GetVersioningAsync(new GetVersioningArgs() + var versioningConfig = await minio.GetVersioningAsync(new GetVersioningArgs() .WithBucket(bucketName) .WithVersions(true)).ConfigureAwait(false); if (versioningConfig is not null && @@ -831,7 +830,7 @@ internal static async Task PutGetStatEncryptedObject_Test2(IMinioClient minio) .WithServerSideEncryption(ssec) .WithCallbackStream(async (stream, cancellationToken) => { - Stream fileStream; + FileStream fileStream; await using ((fileStream = File.Create(tempFileName)).ConfigureAwait(false)) { await stream.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false); diff --git a/Minio.Tests/ReuseTcpConnectionTest.cs b/Minio.Tests/ReuseTcpConnectionTest.cs index cbbc4c647..d5650e780 100644 --- a/Minio.Tests/ReuseTcpConnectionTest.cs +++ b/Minio.Tests/ReuseTcpConnectionTest.cs @@ -89,7 +89,7 @@ private async Task GetObjectLength(string bucket, string objectName) var getObjectArgs = new GetObjectArgs() .WithBucket(bucket) .WithObject(objectName) - .WithCallbackStream(stream => stream.Dispose()); + .WithCallbackStream(async (stream, _) => await stream.DisposeAsync().ConfigureAwait(false)); _ = await minioClient.GetObjectAsync(getObjectArgs).ConfigureAwait(false); return objectLength; diff --git a/Minio/DataModel/Args/GetObjectArgs.cs b/Minio/DataModel/Args/GetObjectArgs.cs index 497178795..74cbda62a 100644 --- a/Minio/DataModel/Args/GetObjectArgs.cs +++ b/Minio/DataModel/Args/GetObjectArgs.cs @@ -28,8 +28,7 @@ public GetObjectArgs() OffsetLengthSet = false; } - internal Action CallBack { get; private set; } - internal Func FuncCallBack { get; private set; } + internal Func CallBack { get; private set; } internal long ObjectOffset { get; private set; } internal long ObjectLength { get; private set; } internal string FileName { get; private set; } @@ -38,7 +37,7 @@ public GetObjectArgs() internal override void Validate() { base.Validate(); - if (CallBack is null && FuncCallBack is null && string.IsNullOrEmpty(FileName)) + if (CallBack is null && string.IsNullOrEmpty(FileName)) throw new MinioException("Atleast one of " + nameof(CallBack) + ", CallBack method or " + nameof(FileName) + " file path to save need to be set for GetObject operation."); @@ -76,8 +75,7 @@ internal override HttpRequestMessageBuilder BuildRequest(HttpRequestMessageBuild { if (!string.IsNullOrEmpty(VersionId)) requestMessageBuilder.AddQueryParameter("versionId", $"{VersionId}"); - if (CallBack is not null) requestMessageBuilder.ResponseWriter = CallBack; - else requestMessageBuilder.FunctionResponseWriter = FuncCallBack; + requestMessageBuilder.ResponseWriter = CallBack; if (Headers.TryGetValue(S3ZipExtractKey, out var value)) requestMessageBuilder.AddQueryParameter(S3ZipExtractKey, value); @@ -87,13 +85,31 @@ internal override HttpRequestMessageBuilder BuildRequest(HttpRequestMessageBuild public GetObjectArgs WithCallbackStream(Action cb) { - CallBack = cb; + CallBack = (stream, cancellationToken) => + { + var taskCompletionSource = new TaskCompletionSource(); + + if (cancellationToken.IsCancellationRequested) + taskCompletionSource.SetCanceled(); + else + try + { + cb(stream); + taskCompletionSource.SetResult(true); + } + catch (Exception ex) + { + taskCompletionSource.SetException(ex); + } + + return taskCompletionSource.Task; + }; return this; } public GetObjectArgs WithCallbackStream(Func cb) { - FuncCallBack = cb; + CallBack = cb; return this; } diff --git a/Minio/DataModel/Args/ListenBucketNotificationsArgs.cs b/Minio/DataModel/Args/ListenBucketNotificationsArgs.cs index 65fc242fb..52f13cfdb 100644 --- a/Minio/DataModel/Args/ListenBucketNotificationsArgs.cs +++ b/Minio/DataModel/Args/ListenBucketNotificationsArgs.cs @@ -71,7 +71,7 @@ internal override HttpRequestMessageBuilder BuildRequest(HttpRequestMessageBuild requestMessageBuilder.AddQueryParameter("prefix", Prefix); requestMessageBuilder.AddQueryParameter("suffix", Suffix); - requestMessageBuilder.FunctionResponseWriter = async (responseStream, cancellationToken) => + requestMessageBuilder.ResponseWriter = async (responseStream, cancellationToken) => { using var sr = new StreamReader(responseStream); while (!sr.EndOfStream) diff --git a/Minio/DataModel/DeleteObjectsRequest.cs b/Minio/DataModel/DeleteObjectsRequest.cs index 7b1853742..00712e2e8 100644 --- a/Minio/DataModel/DeleteObjectsRequest.cs +++ b/Minio/DataModel/DeleteObjectsRequest.cs @@ -1,4 +1,4 @@ -/* +/* * MinIO .NET Library for Amazon S3 Compatible Cloud Storage, (C) 2017 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/Minio/DataModel/Replication/AndOperator.cs b/Minio/DataModel/Replication/AndOperator.cs index ecd83036f..ebc669652 100644 --- a/Minio/DataModel/Replication/AndOperator.cs +++ b/Minio/DataModel/Replication/AndOperator.cs @@ -1,4 +1,4 @@ -/* +/* * MinIO .NET Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/Minio/HttpRequestMessageBuilder.cs b/Minio/HttpRequestMessageBuilder.cs index b941c1c26..ebdfe0fc5 100644 --- a/Minio/HttpRequestMessageBuilder.cs +++ b/Minio/HttpRequestMessageBuilder.cs @@ -51,8 +51,7 @@ public HttpRequestMessageBuilder(HttpMethod method, Uri requestUri) } public Uri RequestUri { get; set; } - public Action ResponseWriter { get; set; } - public Func FunctionResponseWriter { get; set; } + public Func ResponseWriter { get; set; } public HttpMethod Method { get; } public HttpRequestMessage Request diff --git a/Minio/MinioClientExtensions.cs b/Minio/MinioClientExtensions.cs index b6e0f45c3..c93a7fef1 100644 --- a/Minio/MinioClientExtensions.cs +++ b/Minio/MinioClientExtensions.cs @@ -59,7 +59,7 @@ public static IMinioClient WithEndpoint(this IMinioClient minioClient, string en { if (minioClient is null) throw new ArgumentNullException(nameof(minioClient)); - if (port < 1 || port > 65535) + if (port is < 1 or > 65535) throw new ArgumentException( string.Format(CultureInfo.InvariantCulture, "Port {0} is not a number between 1 and 65535", port), nameof(port)); diff --git a/Minio/RequestExtensions.cs b/Minio/RequestExtensions.cs index e55eef215..b23711ee2 100644 --- a/Minio/RequestExtensions.cs +++ b/Minio/RequestExtensions.cs @@ -98,9 +98,7 @@ private static async Task ExecuteTaskCoreAsync(this IMinioClient .ConfigureAwait(false); responseResult = new ResponseResult(request, response); if (requestMessageBuilder.ResponseWriter is not null) - requestMessageBuilder.ResponseWriter(responseResult.ContentStream); - if (requestMessageBuilder.FunctionResponseWriter is not null) - await requestMessageBuilder.FunctionResponseWriter(responseResult.ContentStream, cancellationToken) + await requestMessageBuilder.ResponseWriter(responseResult.ContentStream, cancellationToken) .ConfigureAwait(false); var path = request.RequestUri.LocalPath.TrimStart('/').TrimEnd('/').Split('/');