Skip to content

Commit fb042c4

Browse files
josemalm32Copilot
andauthored
Update MinioClientSettings to UseSsl parsing (#943)
* Initial plan * Make UseSsl parsing strict and avoid inferring from URI scheme Co-authored-by: josemalm32 <23101537+josemalm32@users.noreply.github.com> * Address code review feedback: translate comment and improve null handling Co-authored-by: josemalm32 <23101537+josemalm32@users.noreply.github.com> * Refactor MinioClientSettings for SSL key usage Refactor SSL key handling and remove unused boolean parsing method. * Remove redundant SSL parsing tests Removed multiple tests for SSL connection string parsing. * Refactor access key and secret key retrieval logic * Refactor SSL parsing logic in MinioClientSettings Fix compilation error and improve readability of SSL parsing. * Using InternalsVisibleTo to fix test for Minio Client. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: josemalm32 <23101537+josemalm32@users.noreply.github.com>
1 parent 73b3eba commit fb042c4

File tree

3 files changed

+142
-19
lines changed

3 files changed

+142
-19
lines changed

src/CommunityToolkit.Aspire.Minio.Client/CommunityToolkit.Aspire.Minio.Client.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,10 @@
1414
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
1515
</ItemGroup>
1616

17+
18+
19+
<ItemGroup>
20+
<InternalsVisibleTo Include="CommunityToolkit.Aspire.Minio.Client.Tests" />
21+
</ItemGroup>
22+
1723
</Project>

src/CommunityToolkit.Aspire.Minio.Client/MinioClientSettings.cs

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using System;
2+
using Microsoft.Extensions.DependencyInjection;
23
using Minio;
34
using System.Data.Common;
45

@@ -12,6 +13,7 @@ public sealed class MinioClientSettings
1213
private const string ConnectionStringEndpoint = "Endpoint";
1314
private const string AccessKey = "AccessKey";
1415
private const string SecretKey = "SecretKey";
16+
private const string UseSslKey = "UseSsl";
1517

1618
/// <summary>
1719
/// Endpoint URL
@@ -42,37 +44,53 @@ public sealed class MinioClientSettings
4244

4345
internal void ParseConnectionString(string? connectionString)
4446
{
47+
if (string.IsNullOrWhiteSpace(connectionString))
48+
{
49+
return;
50+
}
51+
52+
// If the connection string is an absolute URI, use it as endpoint.
4553
if (Uri.TryCreate(connectionString, UriKind.Absolute, out var uri))
4654
{
4755
Endpoint = uri;
56+
return;
4857
}
49-
else
58+
59+
var connectionBuilder = new DbConnectionStringBuilder
5060
{
51-
var connectionBuilder = new DbConnectionStringBuilder
52-
{
53-
ConnectionString = connectionString
54-
};
61+
ConnectionString = connectionString
62+
};
5563

56-
if (connectionBuilder.TryGetValue(ConnectionStringEndpoint, out var endpoint)
57-
&&
58-
Uri.TryCreate(endpoint.ToString(), UriKind.Absolute, out var serviceUri))
64+
if (connectionBuilder.TryGetValue(ConnectionStringEndpoint, out var endpoint)
65+
&&
66+
Uri.TryCreate(endpoint.ToString(), UriKind.Absolute, out var serviceUri))
67+
{
68+
Endpoint = serviceUri;
69+
}
70+
71+
// Check for UseSsl (and variants) in the connection string and parse it if present.
72+
if (connectionBuilder.TryGetValue(UseSslKey, out var useSslObj)
73+
&& useSslObj is string useSslValue
74+
&& bool.TryParse(useSslValue, out var parsed))
5975
{
60-
Endpoint = serviceUri;
76+
UseSsl = parsed;
6177
}
62-
63-
if (connectionBuilder.TryGetValue(AccessKey, out var accessKey)
64-
&&
65-
connectionBuilder.TryGetValue(SecretKey, out var secretKey)
66-
&&
67-
!string.IsNullOrEmpty(accessKey.ToString()) && !string.IsNullOrEmpty(secretKey.ToString()))
78+
79+
if (connectionBuilder.TryGetValue(AccessKey, out var accessKeyValue) &&
80+
connectionBuilder.TryGetValue(SecretKey, out var secretKeyValue) &&
81+
accessKeyValue is string accessKey &&
82+
secretKeyValue is string secretKey &&
83+
!string.IsNullOrEmpty(accessKey) &&
84+
!string.IsNullOrEmpty(secretKey))
6885
{
6986
Credentials = new MinioCredentials
7087
{
71-
AccessKey = accessKey.ToString()!, SecretKey = secretKey.ToString()!
88+
AccessKey = accessKey,
89+
SecretKey = secretKey
7290
};
7391
}
74-
}
7592
}
93+
7694
}
7795

7896
/// <summary>
@@ -105,4 +123,4 @@ public class MinioCredentials
105123
/// MinIO Secret Key
106124
/// </summary>
107125
public string SecretKey { get; set; } = string.Empty;
108-
}
126+
}

tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConfigurationTests.cs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,103 @@ public void EndpointIsNullByDefault() =>
1212
[Fact]
1313
public void CredentialsIsNullByDefault() =>
1414
Assert.Null(new MinioClientSettings().Credentials);
15+
16+
[Fact]
17+
public void UseSslIsFalseByDefault()
18+
{
19+
var settings = new MinioClientSettings();
20+
Assert.False(settings.UseSsl);
21+
}
22+
23+
[Fact]
24+
public void ParseConnectionString_HttpsUri_DoesNotInferUseSsl()
25+
{
26+
var settings = new MinioClientSettings();
27+
settings.ParseConnectionString("https://minio.example.com:9000");
28+
29+
Assert.NotNull(settings.Endpoint);
30+
Assert.Equal("https://minio.example.com:9000/", settings.Endpoint.ToString());
31+
Assert.False(settings.UseSsl); // Should remain false since UseSsl was not explicitly set
32+
}
33+
34+
[Fact]
35+
public void ParseConnectionString_HttpUri_DoesNotInferUseSsl()
36+
{
37+
var settings = new MinioClientSettings();
38+
settings.ParseConnectionString("http://minio.example.com:9000");
39+
40+
Assert.NotNull(settings.Endpoint);
41+
Assert.Equal("http://minio.example.com:9000/", settings.Endpoint.ToString());
42+
Assert.False(settings.UseSsl); // Should remain false
43+
}
44+
45+
[Fact]
46+
public void ParseConnectionString_ExplicitUseSslTrue()
47+
{
48+
var settings = new MinioClientSettings();
49+
settings.ParseConnectionString("Endpoint=http://minio.example.com:9000;UseSsl=true;AccessKey=key;SecretKey=secret");
50+
51+
Assert.NotNull(settings.Endpoint);
52+
Assert.True(settings.UseSsl);
53+
}
54+
55+
[Fact]
56+
public void ParseConnectionString_ExplicitUseSslFalse()
57+
{
58+
var settings = new MinioClientSettings();
59+
settings.ParseConnectionString("Endpoint=https://minio.example.com:9000;UseSsl=false;AccessKey=key;SecretKey=secret");
60+
61+
Assert.NotNull(settings.Endpoint);
62+
Assert.False(settings.UseSsl);
63+
}
64+
65+
[Fact]
66+
public void ParseConnectionString_UseSslCaseInsensitive()
67+
{
68+
var settings = new MinioClientSettings();
69+
settings.ParseConnectionString("Endpoint=http://minio.example.com:9000;UseSsl=True;AccessKey=key;SecretKey=secret");
70+
71+
Assert.True(settings.UseSsl);
72+
}
73+
74+
75+
[Fact]
76+
public void ParseConnectionString_WithCredentials()
77+
{
78+
var settings = new MinioClientSettings();
79+
settings.ParseConnectionString("Endpoint=http://minio.example.com:9000;AccessKey=mykey;SecretKey=mysecret;UseSsl=true");
80+
81+
Assert.NotNull(settings.Endpoint);
82+
Assert.NotNull(settings.Credentials);
83+
Assert.Equal("mykey", settings.Credentials.AccessKey);
84+
Assert.Equal("mysecret", settings.Credentials.SecretKey);
85+
Assert.True(settings.UseSsl);
86+
}
87+
88+
[Fact]
89+
public void ParseConnectionString_NullOrEmpty_DoesNotThrow()
90+
{
91+
var settings = new MinioClientSettings();
92+
settings.ParseConnectionString(null);
93+
Assert.Null(settings.Endpoint);
94+
95+
settings = new MinioClientSettings();
96+
settings.ParseConnectionString("");
97+
Assert.Null(settings.Endpoint);
98+
99+
settings = new MinioClientSettings();
100+
settings.ParseConnectionString(" ");
101+
Assert.Null(settings.Endpoint);
102+
}
103+
104+
[Fact]
105+
public void ParseConnectionString_HttpsEndpointInConnectionString_DoesNotInferUseSsl()
106+
{
107+
var settings = new MinioClientSettings();
108+
settings.ParseConnectionString("Endpoint=https://minio.example.com:9000;AccessKey=key;SecretKey=secret");
109+
110+
Assert.NotNull(settings.Endpoint);
111+
Assert.Equal("https://minio.example.com:9000/", settings.Endpoint.ToString());
112+
Assert.False(settings.UseSsl); // Should remain false without explicit UseSsl
113+
}
15114
}

0 commit comments

Comments
 (0)