diff --git a/src/Docker.DotNet.X509/CertificateCredentials.cs b/src/Docker.DotNet.X509/CertificateCredentials.cs index a03bf796..d72efbd8 100644 --- a/src/Docker.DotNet.X509/CertificateCredentials.cs +++ b/src/Docker.DotNet.X509/CertificateCredentials.cs @@ -18,31 +18,38 @@ public HttpMessageHandler ConfigureHandler(HttpMessageHandler handler) #if NET6_0_OR_GREATER if (handler is SocketsHttpHandler socketsHandler) { - socketsHandler.SslOptions.ClientCertificates = new X509Certificate2Collection(); - socketsHandler.SslOptions.ClientCertificates.Add(_certificate); + if (_certificate != null) + { + socketsHandler.SslOptions.ClientCertificates = new X509Certificate2Collection(); + socketsHandler.SslOptions.ClientCertificates.Add(_certificate); + } + socketsHandler.SslOptions.RemoteCertificateValidationCallback = ServerCertificateValidationCallback; return socketsHandler; } #else if (handler is HttpClientHandler httpHandler) { - httpHandler.ClientCertificates.Add(_certificate); + if (_certificate != null && !httpHandler.ClientCertificates.Contains(_certificate)) + { + httpHandler.ClientCertificates.Add(_certificate); + } + httpHandler.ServerCertificateCustomValidationCallback = (message, certificate, chain, sslPolicyErrors) => ServerCertificateValidationCallback(message, certificate, chain, sslPolicyErrors); return httpHandler; } #endif - if (handler is not ManagedHandler managedHandler) + if (handler is ManagedHandler managedHandler) { - return handler; - } + if (_certificate != null && !managedHandler.ClientCertificates.Contains(_certificate)) + { + managedHandler.ClientCertificates.Add(_certificate); + } - if (!managedHandler.ClientCertificates.Contains(_certificate)) - { - managedHandler.ClientCertificates.Add(_certificate); + managedHandler.ServerCertificateValidationCallback = ServerCertificateValidationCallback; + return managedHandler; } - managedHandler.ServerCertificateValidationCallback = ServerCertificateValidationCallback; - return handler; } } \ No newline at end of file diff --git a/src/Docker.DotNet/DockerClient.cs b/src/Docker.DotNet/DockerClient.cs index a55ad4f8..c59eb59e 100644 --- a/src/Docker.DotNet/DockerClient.cs +++ b/src/Docker.DotNet/DockerClient.cs @@ -26,6 +26,7 @@ internal DockerClient( _clientOptions = clientOptions; _hijack = hijack; + Options = clientOptions; System = new SystemOperations(this); Containers = new ContainerOperations(this); Images = new ImageOperations(this); @@ -39,6 +40,8 @@ internal DockerClient( Exec = new ExecOperations(this); } + public ClientOptions Options { get; } + public ISystemOperations System { get; } public IContainerOperations Containers { get; } diff --git a/src/Docker.DotNet/DockerClientBuilder.cs b/src/Docker.DotNet/DockerClientBuilder.cs index 4727ead9..2282c5aa 100644 --- a/src/Docker.DotNet/DockerClientBuilder.cs +++ b/src/Docker.DotNet/DockerClientBuilder.cs @@ -37,7 +37,7 @@ public DockerClientBuilder() /// /// The requested API version. /// The builder instance. - public DockerClientBuilder WithApiVersion(Version version) + public DockerClientBuilder WithApiVersion(Version? version) { ClientOptions = ClientOptions with { ApiVersion = version }; return this; @@ -59,9 +59,11 @@ public DockerClientBuilder WithEndpoint(Uri endpoint) /// /// The authentication provider. /// The builder instance. - public DockerClientBuilder WithAuthProvider(IAuthProvider authProvider) + public DockerClientBuilder WithAuthProvider(IAuthProvider? authProvider) { - ClientOptions = ClientOptions with { AuthProvider = authProvider }; + var nonNullableAuthProvider = authProvider ?? NoopAuthProvider.Instance; + + ClientOptions = ClientOptions with { AuthProvider = nonNullableAuthProvider }; return this; } diff --git a/src/Docker.DotNet/IDockerClient.cs b/src/Docker.DotNet/IDockerClient.cs index 0b51b26b..12830241 100644 --- a/src/Docker.DotNet/IDockerClient.cs +++ b/src/Docker.DotNet/IDockerClient.cs @@ -2,6 +2,8 @@ namespace Docker.DotNet; public interface IDockerClient : IDisposable { + ClientOptions Options { get; } + ISystemOperations System { get; } IContainerOperations Containers { get; }