Reserved URI-template expansion throws for supplementary Unicode characters
Maintainer antworten meist innerhalb von 2 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 74/100
Rechercherichtung
Beginne mit dem Encoder für reservierte Expansion in src/ModelContextProtocol.Core/UriTemplate.cs, etwa bei den Funktionen Encode und AppendHex (ca. Zeile 467-487), wo der Aufruf new Rune(char) bei Surrogatpaaren fehlschlägt. Verfolge, wie ReadResourceAsync in McpClient.Methods.cs zu FormatUri gelangt. Fertig ist, wenn {+name} und {#name} mit einem Zeichen außerhalb der BMP, etwa U+1F600, UTF-8-prozentkodierte Ausgabe erzeugen und das Lesen erfolgreich ist, und ein Regressionstest in McpClientResourceTemplateTests hinzugefügt wurde.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Description
McpClient.ReadResourceAsync(uriTemplate, arguments) throws ArgumentOutOfRangeException when a reserved ({+var}) or fragment ({#var}) URI-template expansion contains a supplementary Unicode character, such as an emoji. This prevents a client from reading resources whose template arguments include those characters, before a resources/read request is sent.
Reproduction
On main at 3338e88e15c42cfc27465143c140d7d10f1a2707, with a connected client and a resource handler that echoes the requested URI:
var result = await client.ReadResourceAsync(
"test://resource/{+name}",
new Dictionary<string, object?> { ["name"] = "hello\U0001F600" });
Expected: The request URI is test://resource/hello%F0%9F%98%80, with U+1F600 percent-encoded as UTF-8, and the resource can be read.
Actual: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'ch'). The focused regression test fails on net10.0 with this stack:
at System.Text.Rune..ctor(Char ch)
at ModelContextProtocol.UriTemplate.<Encode>g__AppendHex|6_0(...) in UriTemplate.cs:487
at ModelContextProtocol.UriTemplate.Encode(String value, Boolean allowReserved) in UriTemplate.cs:467
at ModelContextProtocol.UriTemplate.FormatUri(...) in UriTemplate.cs:392
at ModelContextProtocol.Client.McpClient.ReadResourceAsync(...) in McpClient.Methods.cs:596
I reproduced this by adding a [Fact] to McpClientResourceTemplateTests using its in-memory client/server fixture, then running:
dotnet test tests/ModelContextProtocol.Tests/ModelContextProtocol.Tests.csproj -f net10.0 --filter "FullyQualifiedName~ReservedExpansion_EncodesSupplementaryUnicodeScalar"
Result: 1 failed, 0 passed. The client/server connection completed; expansion failed before the read request.
Cause and possible fix
The reserved-expansion encoder loops over UTF-16 char values and calls new Rune(c) for each non-ASCII character. A supplementary Unicode scalar is a surrogate pair, so constructing a Rune from its first char throws. Decode the scalar from the input span (and advance past both UTF-16 code units) before writing its UTF-8 percent-encoded bytes. A regression test could cover {+name} and {#name} with supplementary Unicode characters.
Relevant code: UriTemplate.cs:487, McpClient.Methods.cs:596. RFC 6570 specifies UTF-8 percent encoding for characters outside the allowed URI set.
- Vorherrschende Sprache
- C#
- Sterne
- 4.6k
- Forks
- 821
- Ø Merge
- 9 T. 3 Std.
- Gemergte PRs (30 T.)
- 3
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus modelcontextprotocol/csharp-sdk
-
ClaimsPrincipal parameter injection sample requestEvtl. vergeben @utsavjain2809 hat das vor 15 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
modelcontextprotocol/csharp-sdk#1899 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Document ClientOAuthOptions.ScopeSelector usageEvtl. vergeben @z0rimo hat das vor 38 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
modelcontextprotocol/csharp-sdk#1867 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
HTTP+SSE client: POST responses are never disposed, leaking one connection per sent messageEvtl. vergeben @yalcinfu22 hat das vor 53 Tagen übernommen. Offen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
modelcontextprotocol/csharp-sdk#1840 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
enhancement needs confirmation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 64/100
modelcontextprotocol/csharp-sdk#678 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
`SseClientTransport.Endpoint` should be nullable when `HttpClient` is providedEvtl. vergeben @lntutor hat das vor 91 Tagen übernommen. Offenenhancement needs confirmation P3 ready for work
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
modelcontextprotocol/csharp-sdk#515 · 6 Kommentare · 3 Reaktionen ·
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in modelcontextprotocol/csharp-sdk
Ähnliche Issues
-
Backend enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Maintainer antworten meist innerhalb von 1 Tag
-
UI: money shows the minus sign next to the number, not before the currency (IL -3.0m, not -IL 3.0m)Offenarea: sim area: unity enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
eyalgolan/statecraft-israel#1107 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
dimitar-radenkov/Pointframe#271 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
qew21/Genshin-Subtitles#45 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
HoffmanEngineering/3d-print-log-api#274 ·
Maintainer antworten meist innerhalb von 1 Tag