Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public static class HttpClientFactory
{
public const string DefaultUserAgentPrefix = "Agent365CLI";
public const string CorrelationIdHeaderName = "x-ms-correlation-id";
public const string ClientRequestIdHeaderName = "client-request-id";

/// <summary>
/// Creates an authenticated HTTP client with standard headers.
Expand Down Expand Up @@ -47,6 +48,9 @@ public static HttpClient CreateAuthenticatedClient(
: correlationId;
client.DefaultRequestHeaders.Add(CorrelationIdHeaderName, effectiveCorrelationId);

// Add CorrelationId as client-request-id header for Graph API tracing
client.DefaultRequestHeaders.Add(ClientRequestIdHeaderName, effectiveCorrelationId);

return client;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,4 +199,48 @@ public void GenerateCorrelationId_ReturnsUniqueValues()
// Assert
id1.Should().NotBe(id2, "Each call should generate a unique correlation ID");
}

[Fact]
public void CreateAuthenticatedClient_SetsClientRequestIdHeader()
{
// Act
using var client = HttpClientFactory.CreateAuthenticatedClient();

// Assert
client.DefaultRequestHeaders.Contains(HttpClientFactory.ClientRequestIdHeaderName).Should().BeTrue();
var clientRequestId = client.DefaultRequestHeaders.GetValues(HttpClientFactory.ClientRequestIdHeaderName).First();
clientRequestId.Should().NotBeNullOrWhiteSpace();
Guid.TryParse(clientRequestId, out _).Should().BeTrue("Client request ID should be a valid GUID");
}

[Fact]
public void CreateAuthenticatedClient_ClientRequestIdMatchesCorrelationId()
{
// Arrange
const string providedCorrelationId = "matching-correlation-id-12345";

// Act
using var client = HttpClientFactory.CreateAuthenticatedClient(correlationId: providedCorrelationId);

// Assert
var correlationId = client.DefaultRequestHeaders.GetValues(HttpClientFactory.CorrelationIdHeaderName).First();
var clientRequestId = client.DefaultRequestHeaders.GetValues(HttpClientFactory.ClientRequestIdHeaderName).First();

correlationId.Should().Be(providedCorrelationId);
clientRequestId.Should().Be(providedCorrelationId);
clientRequestId.Should().Be(correlationId, "Client request ID should match correlation ID for Graph API tracing");
}

[Fact]
public void CreateAuthenticatedClient_WithGeneratedCorrelationId_BothHeadersMatch()
{
// Act
using var client = HttpClientFactory.CreateAuthenticatedClient();

// Assert
var correlationId = client.DefaultRequestHeaders.GetValues(HttpClientFactory.CorrelationIdHeaderName).First();
var clientRequestId = client.DefaultRequestHeaders.GetValues(HttpClientFactory.ClientRequestIdHeaderName).First();

correlationId.Should().Be(clientRequestId, "Both headers should have the same auto-generated correlation ID");
}
}
Loading