Skip to content

Commit 72a36be

Browse files
committed
Use logging source generator in ClientOAuthProvider
1 parent f759db3 commit 72a36be

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

src/ModelContextProtocol.Core/Authentication/ClientOAuthProvider.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace ModelContextProtocol.Authentication;
1414
/// protection or caching - it acquires a token and server metadata and holds it in memory.
1515
/// This is suitable for demonstration and development purposes.
1616
/// </summary>
17-
internal sealed class ClientOAuthProvider
17+
internal sealed partial class ClientOAuthProvider
1818
{
1919
/// <summary>
2020
/// The Bearer authentication scheme.
@@ -207,7 +207,7 @@ private async Task PerformOAuthAuthorizationAsync(
207207
ThrowFailedToHandleUnauthorizedResponse($"Authorization server selector returned a server not in the available list: {selectedAuthServer}. Available servers: {string.Join(", ", availableAuthorizationServers)}");
208208
}
209209

210-
_logger.LogInformation("Selected authorization server: {Server} from {Count} available servers", selectedAuthServer, availableAuthorizationServers.Count);
210+
LogSelectedAuthorizationServer(selectedAuthServer, availableAuthorizationServers.Count);
211211

212212
// Get auth server metadata
213213
var authServerMetadata = await GetAuthServerMetadataAsync(selectedAuthServer, cancellationToken).ConfigureAwait(false);
@@ -235,7 +235,7 @@ private async Task PerformOAuthAuthorizationAsync(
235235
}
236236

237237
_token = token;
238-
_logger.LogInformation("OAuth authorization completed successfully");
238+
LogOAuthAuthorizationCompleted();
239239
}
240240

241241
private async Task<AuthorizationServerMetadata?> GetAuthServerMetadataAsync(Uri authServerUri, CancellationToken cancellationToken)
@@ -270,7 +270,7 @@ private async Task PerformOAuthAuthorizationAsync(
270270
}
271271
catch (Exception ex)
272272
{
273-
_logger.LogError(ex, "Error fetching auth server metadata from {Path}", path);
273+
LogErrorFetchingAuthServerMetadata(ex, path);
274274
}
275275
}
276276

@@ -435,7 +435,7 @@ private async Task PerformDynamicClientRegistrationAsync(
435435
ThrowFailedToHandleUnauthorizedResponse("Authorization server does not support dynamic client registration");
436436
}
437437

438-
_logger.LogInformation("Performing dynamic client registration with {RegistrationEndpoint}", authServerMetadata.RegistrationEndpoint);
438+
LogPerformingDynamicClientRegistration(authServerMetadata.RegistrationEndpoint);
439439

440440
var registrationRequest = new DynamicClientRegistrationRequest
441441
{
@@ -482,7 +482,7 @@ private async Task PerformDynamicClientRegistrationAsync(
482482
_clientSecret = registrationResponse.ClientSecret;
483483
}
484484

485-
_logger.LogInformation("Dynamic client registration successful. Client ID: {ClientId}", _clientId);
485+
LogDynamicClientRegistrationSuccessful(_clientId!);
486486
}
487487

488488
/// <summary>
@@ -581,7 +581,7 @@ private async Task<ProtectedResourceMetadata> ExtractProtectedResourceMetadata(H
581581

582582
// Per RFC: The resource value must be identical to the URL that the client used
583583
// to make the request to the resource server
584-
_logger.LogDebug($"Validating resource metadata against original server URL: {serverUrl}");
584+
LogValidatingResourceMetadata(serverUrl);
585585

586586
if (!VerifyResourceMatch(metadata, serverUrl))
587587
{
@@ -666,4 +666,22 @@ private static void ThrowIfNotBearerScheme(string scheme)
666666
[DoesNotReturn]
667667
private static void ThrowFailedToHandleUnauthorizedResponse(string message) =>
668668
throw new McpException($"Failed to handle unauthorized response with 'Bearer' scheme. {message}");
669+
670+
[LoggerMessage(Level = LogLevel.Information, Message = "Selected authorization server: {Server} from {Count} available servers")]
671+
partial void LogSelectedAuthorizationServer(Uri server, int count);
672+
673+
[LoggerMessage(Level = LogLevel.Information, Message = "OAuth authorization completed successfully")]
674+
partial void LogOAuthAuthorizationCompleted();
675+
676+
[LoggerMessage(Level = LogLevel.Error, Message = "Error fetching auth server metadata from {Path}")]
677+
partial void LogErrorFetchingAuthServerMetadata(Exception ex, string path);
678+
679+
[LoggerMessage(Level = LogLevel.Information, Message = "Performing dynamic client registration with {RegistrationEndpoint}")]
680+
partial void LogPerformingDynamicClientRegistration(Uri registrationEndpoint);
681+
682+
[LoggerMessage(Level = LogLevel.Information, Message = "Dynamic client registration successful. Client ID: {ClientId}")]
683+
partial void LogDynamicClientRegistrationSuccessful(string clientId);
684+
685+
[LoggerMessage(Level = LogLevel.Debug, Message = "Validating resource metadata against original server URL: {ServerUrl}")]
686+
partial void LogValidatingResourceMetadata(Uri serverUrl);
669687
}

src/ModelContextProtocol.Core/Client/SseClientTransport.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ namespace ModelContextProtocol.Client;
1616
public sealed class SseClientTransport : IClientTransport, IAsyncDisposable
1717
{
1818
private readonly SseClientTransportOptions _options;
19-
private readonly HttpClient? _httpClient;
2019
private readonly McpHttpClient _mcpHttpClient;
2120
private readonly ILoggerFactory? _loggerFactory;
2221

22+
private readonly HttpClient? _ownedHttpClient;
23+
2324
/// <summary>
2425
/// Initializes a new instance of the <see cref="SseClientTransport"/> class.
2526
/// </summary>
@@ -61,7 +62,7 @@ public SseClientTransport(SseClientTransportOptions transportOptions, HttpClient
6162

6263
if (ownsHttpClient)
6364
{
64-
_httpClient = httpClient;
65+
_ownedHttpClient = httpClient;
6566
}
6667
}
6768

@@ -99,7 +100,7 @@ private async Task<ITransport> ConnectSseTransportAsync(CancellationToken cancel
99100
/// <inheritdoc />
100101
public ValueTask DisposeAsync()
101102
{
102-
_httpClient?.Dispose();
103+
_ownedHttpClient?.Dispose();
103104
return default;
104105
}
105106
}

0 commit comments

Comments
 (0)