This is an automated email from the ASF dual-hosted git repository.

xiazcy pushed a commit to branch dotnet-http-interceptors
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/dotnet-http-interceptors by 
this push:
     new 5ca9f878cc minor improvements to auth
5ca9f878cc is described below

commit 5ca9f878cca93798d8be563955f825a6de1fe7d3
Author: Yang Xia <[email protected]>
AuthorDate: Thu Mar 19 13:47:09 2026 -0700

    minor improvements to auth
---
 gremlin-dotnet/src/Gremlin.Net/Driver/Auth.cs | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Auth.cs 
b/gremlin-dotnet/src/Gremlin.Net/Driver/Auth.cs
index d7d0770c1b..9014f53ca8 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Auth.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Auth.cs
@@ -83,34 +83,38 @@ namespace Gremlin.Net.Driver
                 AuthenticationServiceName = service,
             };
 
-            return context =>
+            return async context =>
             {
                 if (cachedProvider == null)
                 {
                     lock (cacheLock)
                     {
+                        // FallbackCredentialsFactory only has a sync API, but 
this runs once.
                         cachedProvider ??= 
FallbackCredentialsFactory.GetCredentials();
                     }
                 }
-                var immutableCreds = cachedProvider.GetCredentials();
-                SignRequest(context, region, service, immutableCreds, signer, 
clientConfig);
-                return Task.CompletedTask;
+
+                // Use the async path — important for credential providers 
that perform
+                // network I/O (e.g. IMDS on EC2, ECS task role endpoint).
+                var immutableCreds = await cachedProvider.GetCredentialsAsync()
+                    .ConfigureAwait(false);
+                SignRequest(context, immutableCreds, signer, clientConfig);
             };
         }
 
-        private static void SignRequest(HttpRequestContext context, string 
region, string service, 
+        private static void SignRequest(HttpRequestContext context,
             ImmutableCredentials credentials, AWS4Signer signer, 
SigningClientConfig clientConfig)
         {
             // Build a DefaultRequest from the HttpRequestContext for the AWS 
SDK signer.
             var endpointUri = new 
Uri(context.Uri.GetLeftPart(UriPartial.Authority));
-            var awsRequest = new DefaultRequest(new NullRequest(), service)
+            var awsRequest = new DefaultRequest(new NullRequest(), 
clientConfig.AuthenticationServiceName)
             {
                 HttpMethod = context.Method,
                 Endpoint = endpointUri,
                 ResourcePath = context.Uri.AbsolutePath,
                 Content = context.Body ?? Array.Empty<byte>(),
-                AuthenticationRegion = region,
-                OverrideSigningServiceName = service,
+                AuthenticationRegion = clientConfig.AuthenticationRegion,
+                OverrideSigningServiceName = 
clientConfig.AuthenticationServiceName,
             };
 
             // Copy headers (skip Host — signer adds it)
@@ -143,8 +147,7 @@ namespace Gremlin.Net.Driver
             awsRequest.Headers["x-amz-content-sha256"] = payloadHash;
 
             // Sign the request
-            signer.Sign(awsRequest, clientConfig, new RequestMetrics(),
-                credentials.AccessKey, credentials.SecretKey);
+            signer.Sign(awsRequest, clientConfig, new RequestMetrics(), 
credentials);
 
             // Copy signed headers back to context. Cherry-pick the known 
SigV4 headers
             // because the .NET Dictionary is case-sensitive and the AWS SDK 
may use

Reply via email to