feat(admin): add safe processing monitor and operation correlation
This commit is contained in:
@@ -106,13 +106,37 @@ public sealed class AiPrivacyPolicyTests
|
||||
Assert.Equal("strategy.snapshot", capture.TaskType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Correlation_comes_only_from_the_actual_operation_scope_for_all_sidecar_paths()
|
||||
{
|
||||
await using var fixture = await Fixture.CreateAsync(adminEnabled: false);
|
||||
var execution = new AiOperationExecutionScope();
|
||||
var capture = new CaptureHandler();
|
||||
using var client = new HttpClient(new AiPrivacyHeaderHandler(new HttpContextAccessor(), fixture.Policy, execution) { InnerHandler = capture });
|
||||
var id = Guid.NewGuid();
|
||||
var lease = new UserOperationLease(id, "user-1", "lease", "cv.process", "local_only", "cv_extraction_run", "1", 1, null);
|
||||
using (execution.Use(new(lease, "local_only")))
|
||||
{
|
||||
using var request = new HttpRequestMessage(HttpMethod.Post, "http://ai-service/cv-import/extract");
|
||||
request.Headers.Add("X-Operation-Id", "SECRET_untrusted_header");
|
||||
await client.SendAsync(request);
|
||||
Assert.Equal(id.ToString("D"), capture.Correlation);
|
||||
}
|
||||
using var ordinary = new HttpRequestMessage(HttpMethod.Get, "http://ai-service/health");
|
||||
ordinary.Headers.Add("X-Operation-Id", "SECRET_untrusted_header");
|
||||
await client.SendAsync(ordinary);
|
||||
Assert.Null(capture.Correlation);
|
||||
}
|
||||
|
||||
private sealed class CaptureHandler : HttpMessageHandler
|
||||
{
|
||||
public string? ExternalAllowed { get; private set; }
|
||||
public string? TaskType { get; private set; }
|
||||
public string? Correlation { get; private set; }
|
||||
|
||||
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
|
||||
{
|
||||
Correlation = request.Headers.TryGetValues("X-Operation-Id", out var correlation) ? correlation.Single() : null;
|
||||
ExternalAllowed = request.Headers.TryGetValues(AiPrivacyPolicy.ExternalAllowedHeader, out var values)
|
||||
? values.Single()
|
||||
: null;
|
||||
|
||||
Reference in New Issue
Block a user