HTTP logging truncates catch-all route parameters in the formatted request path
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
Línea de trabajo
Empieza leyendo HttpRouteFormatter.Format y compara su tratamiento de las rutas catch-all con HttpRouteParser.TryExtractParameters, que, según indica el issue, ya gestiona este caso. Usa la reproducción a nivel de unidad del issue para comprobar la salida formateada para {*path} y {**path}. La tarea estará completa cuando el formatter conserve todos los segmentos restantes de la ruta y genere la ruta esperada redacted.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Description
When HTTP logging uses the formatted path mode, which is the default (IncomingPathLoggingMode.Formatted for AddHttpLoggingRedaction and OutgoingPathLoggingMode.Formatted for AddExtendedHttpClientLogging), the request path is built by the internal HttpRouteFormatter. For a route with a catch-all parameter such as {*path} or {**path}, the formatter takes only the first path segment of the value and drops the rest of the path.
#5466 fixed the same problem in HttpRouteParser.TryExtractParameters, which the structured path mode uses. HttpRouteFormatter.Format still ignores Segment.IsCatchAll.
As a result:
- A redactor receives only the first segment, so
files/a/1andfiles/a/2produce the same redacted value. - When the catch-all parameter isn't redacted, the logged path is cut short (for example,
api/[REDACTED]/files/ainstead ofapi/[REDACTED]/files/a/b/c).
Reproduction steps
Unit-level repro against the internal formatter, using the FakeRedactorProvider from Microsoft.Extensions.Compliance.Testing:
var redactorProvider = new FakeRedactorProvider(new FakeRedactorOptions { RedactionFormat = "Redacted:{0}" });
var formatter = new HttpRouteFormatter(new HttpRouteParser(redactorProvider), redactorProvider);
var parametersToRedact = new Dictionary<string, DataClassification>
{
{ "userId", FakeTaxonomy.PrivateData },
{ "path", FakeTaxonomy.PrivateData },
};
formatter.Format("api/{userId}/files/{*path}", "api/user1/files/a/b/c", HttpRouteParameterRedactionMode.Strict, parametersToRedact);
From the code, an ASP.NET Core app that maps app.MapGet("/api/{userId}/files/{*path}", ...) and calls AddHttpLoggingRedaction() goes through the same formatter. I reproduced it with the unit-level example above, not in a running app.
Expected behavior
api/Redacted:user1/files/Redacted:a/b/c
Actual behavior
api/Redacted:user1/files/Redacted:a
Regression?
No.
Known workarounds
From the code, setting RequestPathLoggingMode to Structured should avoid it, since that mode uses HttpRouteParser, which handles catch-all parameters.
Configuration
Current main, .NET 10. Found by reading the code and confirmed with a unit test.
Other information
The formatter can apply the same rule the parser already uses: a catch-all parameter takes the rest of the path.
- Lenguaje dominante
- C#
- Estrellas
- 3.3k
- Forks
- 914
- Merge medio
- 2 d 7 h
- PR fusionados (30 d)
- 42
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de dotnet/extensions
-
Managed DNS resolver ignores tab-separated nameserver lines in /etc/resolv.confPosiblemente ocupada @johnkaram02 la tomó hoy. Abiertoneeds-area-label untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
dotnet/extensions#7881 ·
Los mantenedores suelen responder en 1 día
-
[Microsoft.Extensions.AI.OpenAI] AsOpenAIStreamingChatCompletionUpdatesAsync writes finish_reason "stop" on every chunk with a null FinishReasonPosiblemente ocupada @nurullahturkoglu la tomó hace 3 días. Abiertoarea-ai untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
dotnet/extensions#7863 ·
Los mantenedores suelen responder en 1 día
-
Outgoing HttpClient LatencyInfo enricher value has incomplete escapingPosiblemente ocupada @zjdangge la tomó hace 4 días. Abiertoarea-telemetry untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
dotnet/extensions#7757 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
OpenAIResponsesChatClient.ToChatMessages never surfaces reasoning.content — only reads GetSummaryText()Posiblemente ocupada @LouisDeconinck la tomó hace 40 días. Abiertoarea-ai untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
dotnet/extensions#7714 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
[Microsoft.Extensions.AI] AIFunctionFactory does not tolerate a JsonElement of ValueKind String as a JSON-stringified argument (gap in #6572)Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertoarea-ai enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
dotnet/extensions#7626 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de dotnet/extensions
Issues similares
-
area-multitenancy area-security p1-recommended priority-high technical-debt
Dificultad 2/5 Menos de una hora Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
help wanted needs-unity ready for a contributor
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
eyalgolan/statecraft-israel#1542 ·
Los mantenedores suelen responder en 1 día
-
kind/enhancement Provider Upgrade pulumi/pulumi-azure R1 Task
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
pulumi/pulumi-azure#3669 ·
-
type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día