Skip to content

Commit 8600cdc

Browse files
authored
fix: Preserve client options endpoint (#86)
1 parent fade14a commit 8600cdc

13 files changed

Lines changed: 60 additions & 36 deletions

File tree

src/Docker.DotNet.Handler.Abstractions/IDockerHandlerFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ public interface IDockerHandlerFactory : IStreamHijacker
1010
/// </summary>
1111
/// <param name="clientOptions">The client options.</param>
1212
/// <param name="logger">The logger instance.</param>
13-
/// <returns>A tuple containing the configured handler and normalized endpoint URI.</returns>
14-
Tuple<HttpMessageHandler, Uri> CreateHandler(ClientOptions clientOptions, ILogger logger);
13+
/// <returns>The resolved transport.</returns>
14+
ResolvedTransport CreateHandler(ClientOptions clientOptions, ILogger logger);
1515
}

src/Docker.DotNet.Handler.Abstractions/IDockerHandlerFactory`1.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public interface IDockerHandlerFactory<in TTransportOptions> : IDockerHandlerFac
1212
/// <param name="transportOptions">The transport-specific options.</param>
1313
/// <param name="clientOptions">The client options.</param>
1414
/// <param name="logger">The logger instance.</param>
15-
/// <returns>A tuple containing the configured handler and normalized endpoint URI.</returns>
16-
Tuple<HttpMessageHandler, Uri> CreateHandler(TTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger);
15+
/// <returns>The resolved transport.</returns>
16+
ResolvedTransport CreateHandler(TTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger);
1717
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Docker.DotNet.Handler.Abstractions;
2+
3+
/// <summary>
4+
/// Represents a transport-specific HTTP handler and the effective endpoint used for requests.
5+
/// </summary>
6+
/// <param name="Handler">The configured HTTP message handler.</param>
7+
/// <param name="EffectiveEndpoint">The normalized endpoint URI used for requests.</param>
8+
public sealed record ResolvedTransport(HttpMessageHandler Handler, Uri EffectiveEndpoint);

src/Docker.DotNet.LegacyHttp/DockerHandlerFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ private DockerHandlerFactory()
99
public static IDockerHandlerFactory<LegacyHttpTransportOptions> Instance { get; }
1010
= new DockerHandlerFactory();
1111

12-
public Tuple<HttpMessageHandler, Uri> CreateHandler(ClientOptions clientOptions, ILogger logger)
12+
public ResolvedTransport CreateHandler(ClientOptions clientOptions, ILogger logger)
1313
{
1414
var transportOptions = new LegacyHttpTransportOptions();
1515
Validate(transportOptions, clientOptions);
1616
return CreateHandler(transportOptions, clientOptions, logger);
1717
}
1818

19-
public Tuple<HttpMessageHandler, Uri> CreateHandler(LegacyHttpTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
19+
public ResolvedTransport CreateHandler(LegacyHttpTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
2020
{
2121
Validate(transportOptions, clientOptions);
2222

@@ -25,7 +25,7 @@ public Tuple<HttpMessageHandler, Uri> CreateHandler(LegacyHttpTransportOptions t
2525
var handler = new ManagedHandler(logger);
2626
transportOptions.ConfigureHandler(handler);
2727

28-
return new Tuple<HttpMessageHandler, Uri>(handler, uri);
28+
return new ResolvedTransport(handler, uri);
2929
}
3030

3131
public Task<WriteClosableStream> HijackStreamAsync(HttpContent content)

src/Docker.DotNet.NPipe/DockerHandlerFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ private DockerHandlerFactory()
99
public static IDockerHandlerFactory<NPipeTransportOptions> Instance { get; }
1010
= new DockerHandlerFactory();
1111

12-
public Tuple<HttpMessageHandler, Uri> CreateHandler(ClientOptions clientOptions, ILogger logger)
12+
public ResolvedTransport CreateHandler(ClientOptions clientOptions, ILogger logger)
1313
{
1414
var transportOptions = new NPipeTransportOptions();
1515
Validate(transportOptions, clientOptions);
1616
return CreateHandler(transportOptions, clientOptions, logger);
1717
}
1818

19-
public Tuple<HttpMessageHandler, Uri> CreateHandler(NPipeTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
19+
public ResolvedTransport CreateHandler(NPipeTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
2020
{
2121
Validate(transportOptions, clientOptions);
2222

@@ -60,7 +60,7 @@ await clientStream.ConnectAsync(namedPipeConnectTimeout, cancellationToken)
6060
var handler = new ManagedHandler(streamOpener, logger);
6161
transportOptions.ConfigureHandler(handler);
6262

63-
return new Tuple<HttpMessageHandler, Uri>(handler, uri);
63+
return new ResolvedTransport(handler, uri);
6464
}
6565

6666
public Task<WriteClosableStream> HijackStreamAsync(HttpContent content)

src/Docker.DotNet.NativeHttp/DockerHandlerFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ private DockerHandlerFactory()
1515
public static IDockerHandlerFactory<NativeHttpTransportOptions> Instance { get; }
1616
= new DockerHandlerFactory();
1717

18-
public Tuple<HttpMessageHandler, Uri> CreateHandler(ClientOptions clientOptions, ILogger logger)
18+
public ResolvedTransport CreateHandler(ClientOptions clientOptions, ILogger logger)
1919
{
2020
var transportOptions = new NativeHttpTransportOptions();
2121
Validate(transportOptions, clientOptions);
2222
return CreateHandler(transportOptions, clientOptions, logger);
2323
}
2424

25-
public Tuple<HttpMessageHandler, Uri> CreateHandler(NativeHttpTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
25+
public ResolvedTransport CreateHandler(NativeHttpTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
2626
{
2727
Validate(transportOptions, clientOptions);
2828

@@ -43,7 +43,7 @@ public Tuple<HttpMessageHandler, Uri> CreateHandler(NativeHttpTransportOptions t
4343
transportOptions.ConfigureHandler(handler);
4444
#endif
4545

46-
return new Tuple<HttpMessageHandler, Uri>(handler, uri);
46+
return new ResolvedTransport(handler, uri);
4747
}
4848

4949
public async Task<WriteClosableStream> HijackStreamAsync(HttpContent content)

src/Docker.DotNet.Unix/DockerHandlerFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ private DockerHandlerFactory()
99
public static IDockerHandlerFactory<UnixSocketTransportOptions> Instance { get; }
1010
= new DockerHandlerFactory();
1111

12-
public Tuple<HttpMessageHandler, Uri> CreateHandler(ClientOptions clientOptions, ILogger logger)
12+
public ResolvedTransport CreateHandler(ClientOptions clientOptions, ILogger logger)
1313
{
1414
var transportOptions = new UnixSocketTransportOptions();
1515
Validate(transportOptions, clientOptions);
1616
return CreateHandler(transportOptions, clientOptions, logger);
1717
}
1818

19-
public Tuple<HttpMessageHandler, Uri> CreateHandler(UnixSocketTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
19+
public ResolvedTransport CreateHandler(UnixSocketTransportOptions transportOptions, ClientOptions clientOptions, ILogger logger)
2020
{
2121
Validate(transportOptions, clientOptions);
2222

@@ -41,7 +41,7 @@ await socket.ConnectAsync(endpoint)
4141
var handler = new ManagedHandler(socketOpener, logger);
4242
transportOptions.ConfigureHandler(handler);
4343

44-
return new Tuple<HttpMessageHandler, Uri>(handler, uri);
44+
return new ResolvedTransport(handler, uri);
4545
}
4646

4747
public Task<WriteClosableStream> HijackStreamAsync(HttpContent content)

src/Docker.DotNet/DockerClient.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,22 @@ public sealed class DockerClient : IDockerClient
1212

1313
private readonly ClientOptions _clientOptions;
1414

15+
private readonly Uri _effectiveEndpoint;
16+
1517
private readonly IStreamHijacker _hijack;
1618

1719
internal DockerClient(
1820
HttpMessageHandler handler,
1921
ClientOptions clientOptions,
22+
Uri effectiveEndpoint,
2023
IStreamHijacker hijack,
2124
ILogger logger)
2225
{
2326
_client = new HttpClient(handler, true);
2427
_client.Timeout = Timeout.InfiniteTimeSpan;
2528

2629
_clientOptions = clientOptions;
30+
_effectiveEndpoint = effectiveEndpoint;
2731
_hijack = hijack;
2832

2933
Options = clientOptions;
@@ -398,7 +402,7 @@ private HttpRequestMessage PrepareRequest(HttpMethod method, string path, IQuery
398402
throw new ArgumentNullException(nameof(path));
399403
}
400404

401-
var request = new HttpRequestMessage(method, HttpUtility.BuildUri(_clientOptions.Endpoint, _clientOptions.ApiVersion, path, queryString));
405+
var request = new HttpRequestMessage(method, HttpUtility.BuildUri(_effectiveEndpoint, _clientOptions.ApiVersion, path, queryString));
402406
request.Version = HttpVersion.Version11;
403407
request.Headers.Add("User-Agent", UserAgent);
404408

src/Docker.DotNet/DockerClientBuilder.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,13 +196,11 @@ public virtual DockerClient Build()
196196
{
197197
var transportFactory = ResolveTransportFactory(ClientOptions.Endpoint.Scheme);
198198

199-
var (handler, endpoint) = transportFactory.CreateHandler(ClientOptions, Logger);
199+
var resolvedTransport = transportFactory.CreateHandler(ClientOptions, Logger);
200200

201-
var clientOptions = ClientOptions with { Endpoint = endpoint };
201+
var authenticatedHandler = ClientOptions.AuthProvider.ConfigureHandler(resolvedTransport.Handler);
202202

203-
var authenticatedHandler = clientOptions.AuthProvider.ConfigureHandler(handler);
204-
205-
return new DockerClient(authenticatedHandler, clientOptions, transportFactory, Logger);
203+
return new DockerClient(authenticatedHandler, ClientOptions, resolvedTransport.EffectiveEndpoint, transportFactory, Logger);
206204
}
207205

208206
/// <summary>

src/Docker.DotNet/DockerClientBuilder`1.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,10 @@ public DockerClientBuilder(
2929
/// <returns>A configured <see cref="DockerClient"/> instance.</returns>
3030
public override DockerClient Build()
3131
{
32-
var (handler, endpoint) = _transportFactory.CreateHandler(_transportOptions, ClientOptions, Logger);
32+
var resolvedTransport = _transportFactory.CreateHandler(_transportOptions, ClientOptions, Logger);
3333

34-
var clientOptions = ClientOptions with { Endpoint = endpoint };
34+
var authenticatedHandler = ClientOptions.AuthProvider.ConfigureHandler(resolvedTransport.Handler);
3535

36-
var authenticatedHandler = clientOptions.AuthProvider.ConfigureHandler(handler);
37-
38-
return new DockerClient(authenticatedHandler, clientOptions, _transportFactory, Logger);
36+
return new DockerClient(authenticatedHandler, ClientOptions, resolvedTransport.EffectiveEndpoint, _transportFactory, Logger);
3937
}
4038
}

0 commit comments

Comments
 (0)