diff --git a/Directory.Build.props b/Directory.Build.props index 4061ca7d42..6b2feba744 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -28,6 +28,7 @@ latest Default true + true true $(MSBuildProjectName.Contains('Test')) diff --git a/Minio/ApiEndpoints/ObjectOperations.cs b/Minio/ApiEndpoints/ObjectOperations.cs index c5a6875787..307bb474fa 100644 --- a/Minio/ApiEndpoints/ObjectOperations.cs +++ b/Minio/ApiEndpoints/ObjectOperations.cs @@ -1207,7 +1207,7 @@ await ExecuteTaskAsync(NoErrorHandlers, requestMessageBuilder, cancellationToken { PartNumber = int.Parse(c.Element(ns + "PartNumber").Value, CultureInfo.CurrentCulture), - ETag = c.Element(ns + "ETag").Value.Replace("\"", string.Empty), + ETag = c.Element(ns + "ETag").Value.Replace("\"", string.Empty, StringComparison.OrdinalIgnoreCase), Size = long.Parse(c.Element(ns + "Size").Value, CultureInfo.CurrentCulture) }; diff --git a/Minio/Credentials/IAMAWSProvider.cs b/Minio/Credentials/IAMAWSProvider.cs index a3eba02592..dce57024ce 100644 --- a/Minio/Credentials/IAMAWSProvider.cs +++ b/Minio/Credentials/IAMAWSProvider.cs @@ -69,7 +69,7 @@ public AccessCredentials GetCredentials() url = RequestUtil.MakeTargetURL("sts." + region + ".amazonaws.com", true); } - IClientProvider provider = new WebIdentityProvider() + var provider = new WebIdentityProvider() .WithSTSEndpoint(url) .WithRoleAction("AssumeRoleWithWebIdentity") .WithDurationInSeconds(null) @@ -125,7 +125,7 @@ internal AccessCredentials GetAccessCredentials(string tokenFile) url = new Uri(urlStr); } - IClientProvider provider = new WebIdentityProvider() + var provider = new WebIdentityProvider() .WithJWTSupplier(() => { var tokenContents = File.ReadAllText(tokenFile); @@ -238,7 +238,8 @@ public IAMAWSProvider WithEndpoint(string endpoint) if (string.IsNullOrEmpty(endpoint)) throw new ArgumentException($"'{nameof(endpoint)}' cannot be null or empty.", nameof(endpoint)); - if (endpoint.Contains("https") || endpoint.Contains("http")) + if (endpoint.Contains("https", StringComparison.OrdinalIgnoreCase) || + endpoint.Contains("http", StringComparison.OrdinalIgnoreCase)) CustomEndPoint = new Uri(endpoint); else CustomEndPoint = RequestUtil.MakeTargetURL(endpoint, true); diff --git a/Minio/DataModel/Args/PutObjectArgs.cs b/Minio/DataModel/Args/PutObjectArgs.cs index ec5090ad33..e029b063b6 100644 --- a/Minio/DataModel/Args/PutObjectArgs.cs +++ b/Minio/DataModel/Args/PutObjectArgs.cs @@ -121,7 +121,8 @@ var hash #else var hash = SHA256.HashData(RequestBody.Span); #endif - var hex = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); + var hex = BitConverter.ToString(hash).Replace("-", string.Empty, StringComparison.OrdinalIgnoreCase) + .ToLowerInvariant(); requestMessageBuilder.AddOrUpdateHeaderParameter("x-amz-content-sha256", hex); requestMessageBuilder.SetBody(RequestBody); } diff --git a/Minio/DataModel/Item.cs b/Minio/DataModel/Item.cs index 201e1d94d3..e3e7620f87 100644 --- a/Minio/DataModel/Item.cs +++ b/Minio/DataModel/Item.cs @@ -32,7 +32,7 @@ public string ETag set { if (value is not null) - etag = value.Replace("\"", string.Empty); + etag = value.Replace("\"", string.Empty, StringComparison.OrdinalIgnoreCase); else etag = null; } diff --git a/Minio/DataModel/ObjectStat.cs b/Minio/DataModel/ObjectStat.cs index 87545eab1c..ecc942ebac 100644 --- a/Minio/DataModel/ObjectStat.cs +++ b/Minio/DataModel/ObjectStat.cs @@ -74,7 +74,7 @@ public static ObjectStat FromResponseHeaders(string objectName, IDictionary ExtractHeaders(Span data) + private Dictionary ExtractHeaders(Span data) { var headerMap = new Dictionary(StringComparer.Ordinal); var offset = 0; diff --git a/Minio/Exceptions/CredentialsProviderException.cs b/Minio/Exceptions/CredentialsProviderException.cs index 7b02e6281a..7d8ca386a3 100644 --- a/Minio/Exceptions/CredentialsProviderException.cs +++ b/Minio/Exceptions/CredentialsProviderException.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"); @@ -21,11 +21,11 @@ namespace Minio.Exceptions; [Serializable] public class CredentialsProviderException : MinioException { - private readonly string CredentialProviderType; + private readonly string credentialProviderType; public CredentialsProviderException(string credentialProviderType, string message) : base(message) { - CredentialProviderType = credentialProviderType; + this.credentialProviderType = credentialProviderType; } public CredentialsProviderException(ResponseResult serverResponse) : base(serverResponse) @@ -50,6 +50,6 @@ public CredentialsProviderException(string message, Exception innerException) : public override string ToString() { - return $"{CredentialProviderType}: {base.ToString()}"; + return $"{credentialProviderType}: {base.ToString()}"; } } diff --git a/Minio/Handlers/DefaultErrorHandler.cs b/Minio/Handlers/DefaultErrorHandler.cs index 8bd0f5b8f2..0ef4dc5913 100644 --- a/Minio/Handlers/DefaultErrorHandler.cs +++ b/Minio/Handlers/DefaultErrorHandler.cs @@ -7,6 +7,8 @@ public class DefaultErrorHandler : IApiResponseErrorHandler { public void Handle(ResponseResult response) { + if (response is null) throw new ArgumentNullException(nameof(response)); + if (response.StatusCode is < HttpStatusCode.OK or >= HttpStatusCode.BadRequest) MinioClient.ParseError(response); } diff --git a/Minio/Handlers/DefaultRetryPolicyHandler.cs b/Minio/Handlers/DefaultRetryPolicyHandler.cs index fa0ad34ea4..1b8e72f7e0 100644 --- a/Minio/Handlers/DefaultRetryPolicyHandler.cs +++ b/Minio/Handlers/DefaultRetryPolicyHandler.cs @@ -17,6 +17,8 @@ public DefaultRetryPolicyHandler(Func>, Task Handle(Func> executeRequestCallback) { + if (executeRequestCallback is null) throw new ArgumentNullException(nameof(executeRequestCallback)); + if (RetryPolicyHandler is not null) return RetryPolicyHandler.Invoke(executeRequestCallback); diff --git a/Minio/Helper/BuilderUtil.cs b/Minio/Helper/BuilderUtil.cs index 85c0c852a3..8be1fa675c 100644 --- a/Minio/Helper/BuilderUtil.cs +++ b/Minio/Helper/BuilderUtil.cs @@ -1,4 +1,4 @@ -/* +/* * MinIO .NET Library for Amazon S3 Compatible Cloud Storage, (C) 2020 MinIO, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,7 +26,7 @@ public static bool IsAwsDualStackEndpoint(string endpoint) if (string.IsNullOrEmpty(endpoint)) throw new ArgumentException($"'{nameof(endpoint)}' cannot be null or empty.", nameof(endpoint)); - return endpoint.Contains(".dualstack."); + return endpoint.Contains(".dualstack.", StringComparison.OrdinalIgnoreCase); } public static bool IsAwsAccelerateEndpoint(string endpoint) diff --git a/Minio/Helper/Utils.cs b/Minio/Helper/Utils.cs index 6f640df843..05546cc594 100644 --- a/Minio/Helper/Utils.cs +++ b/Minio/Helper/Utils.cs @@ -299,7 +299,7 @@ var hashedBytes } [SuppressMessage("Design", "MA0051:Method is too long", Justification = "One time list of type mappings")] - private static IDictionary AddContentTypeMappings() + private static Dictionary AddContentTypeMappings() { return new Dictionary(StringComparer.OrdinalIgnoreCase) { diff --git a/Minio/MinioClient.cs b/Minio/MinioClient.cs index f1ee8efda0..1be038218f 100644 --- a/Minio/MinioClient.cs +++ b/Minio/MinioClient.cs @@ -76,7 +76,7 @@ public MinioClient() /// /// Default error handling delegate /// - private IApiResponseErrorHandler DefaultErrorHandlingDelegate { get; } = new DefaultErrorHandler(); + public IApiResponseErrorHandler DefaultErrorHandler { get; set; } = new DefaultErrorHandler(); // Save Credentials from user internal string AccessKey { get; set; } @@ -326,7 +326,7 @@ internal async Task CreateRequest( if (method == HttpMethod.Put && objectName is null && resourcePath is null) // use path style for make bucket to workaround "AuthorizationHeaderMalformed" error from s3.amazonaws.com usePathStyle = true; - else if (resourcePath?.Contains("location") == true) + else if (resourcePath?.Contains("location", StringComparison.OrdinalIgnoreCase) == true) // use path style for location query usePathStyle = true; else if (bucketName.Contains('.', StringComparison.Ordinal) && Secure) @@ -608,7 +608,7 @@ private static void ParseErrorFromContent(ResponseResult response) && errResponse.Code.Equals("InvalidRequest", StringComparison.OrdinalIgnoreCase)) { var legalHold = new Dictionary(StringComparer.Ordinal) { { "legal-hold", "" } }; - if (response.Request.RequestUri.Query.Contains("legalHold")) + if (response.Request.RequestUri.Query.Contains("legalHold", StringComparison.OrdinalIgnoreCase)) throw new MissingObjectLockConfigurationException(errResponse.BucketName, errResponse.Message); } @@ -650,7 +650,7 @@ private void HandleIfErrorResponse(ResponseResult response, IEnumerable diff --git a/Minio/V4Authenticator.cs b/Minio/V4Authenticator.cs index 38b4385a64..a96019b5a9 100644 --- a/Minio/V4Authenticator.cs +++ b/Minio/V4Authenticator.cs @@ -263,7 +263,8 @@ ReadOnlySpan hash /// Hexlified string of input bytes private string BytesToHex(ReadOnlySpan checkSum) { - return BitConverter.ToString(checkSum.ToArray()).Replace("-", string.Empty).ToLowerInvariant(); + return BitConverter.ToString(checkSum.ToArray()).Replace("-", string.Empty, StringComparison.OrdinalIgnoreCase) + .ToLowerInvariant(); } /// @@ -545,7 +546,8 @@ var hash #else var hash = SHA256.HashData(body.Span); #endif - var hex = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); + var hex = BitConverter.ToString(hash).Replace("-", string.Empty, StringComparison.OrdinalIgnoreCase) + .ToLowerInvariant(); requestBuilder.AddOrUpdateHeaderParameter("x-amz-content-sha256", hex); } else if (!IsSecure && !requestBuilder.Content.IsEmpty)