Skip to content

Commit 09cf5eb

Browse files
Copilotericstj
andcommitted
Address review feedback: move GetUtf8String to EncodingUtilities, remove NoBomUtf8Encoding from StreamClientSessionTransport
Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com>
1 parent b530d53 commit 09cf5eb

5 files changed

Lines changed: 25 additions & 20 deletions

File tree

src/Common/EncodingUtilities.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ public static byte[] GetUtf8Bytes(ReadOnlySpan<char> utf16)
2020
return bytes;
2121
}
2222

23+
/// <summary>Decodes a UTF-8 <see cref="ReadOnlySequence{T}"/> to a <see cref="string"/>.</summary>
24+
public static string GetUtf8String(in ReadOnlySequence<byte> sequence)
25+
{
26+
if (sequence.IsEmpty)
27+
{
28+
return string.Empty;
29+
}
30+
31+
return sequence.IsSingleSegment
32+
? Encoding.UTF8.GetString(sequence.First.Span)
33+
: Encoding.UTF8.GetString(sequence.ToArray());
34+
}
35+
2336
/// <summary>
2437
/// Encodes binary data to base64-encoded UTF-8 bytes.
2538
/// </summary>

src/ModelContextProtocol.Core/Client/StdioClientTransport.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public sealed partial class StdioClientTransport : IClientTransport
3131
private static readonly object s_consoleEncodingLock = new();
3232
#endif
3333

34+
private static readonly UTF8Encoding s_noBomUtf8Encoding = new(encoderShouldEmitUTF8Identifier: false);
35+
3436
private readonly StdioClientTransportOptions _options;
3537
private readonly ILoggerFactory? _loggerFactory;
3638

@@ -85,10 +87,10 @@ public async Task<ITransport> ConnectAsync(CancellationToken cancellationToken =
8587
UseShellExecute = false,
8688
CreateNoWindow = true,
8789
WorkingDirectory = _options.WorkingDirectory ?? Environment.CurrentDirectory,
88-
StandardOutputEncoding = StreamClientSessionTransport.NoBomUtf8Encoding,
89-
StandardErrorEncoding = StreamClientSessionTransport.NoBomUtf8Encoding,
90+
StandardOutputEncoding = s_noBomUtf8Encoding,
91+
StandardErrorEncoding = s_noBomUtf8Encoding,
9092
#if NET
91-
StandardInputEncoding = StreamClientSessionTransport.NoBomUtf8Encoding,
93+
StandardInputEncoding = s_noBomUtf8Encoding,
9294
#endif
9395
};
9496

@@ -173,7 +175,7 @@ public async Task<ITransport> ConnectAsync(CancellationToken cancellationToken =
173175
Encoding originalInputEncoding = Console.InputEncoding;
174176
try
175177
{
176-
Console.InputEncoding = StreamClientSessionTransport.NoBomUtf8Encoding;
178+
Console.InputEncoding = s_noBomUtf8Encoding;
177179
processStarted = process.Start();
178180
}
179181
finally

src/ModelContextProtocol.Core/Client/StreamClientSessionTransport.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using ModelContextProtocol.Protocol;
33
using System.Buffers;
44
using System.IO.Pipelines;
5-
using System.Text;
65
using System.Text.Json;
76

87
namespace ModelContextProtocol.Client;
@@ -12,8 +11,6 @@ internal class StreamClientSessionTransport : TransportBase
1211
{
1312
private static readonly byte[] s_newlineBytes = "\n"u8.ToArray();
1413

15-
internal static UTF8Encoding NoBomUtf8Encoding { get; } = new(encoderShouldEmitUTF8Identifier: false);
16-
1714
private readonly PipeReader _serverOutputPipe;
1815
private readonly Stream _serverInputStream;
1916
private readonly SemaphoreSlim _sendLock = new(1, 1);
@@ -120,7 +117,7 @@ private async Task ProcessLineAsync(ReadOnlySequence<byte> line, CancellationTok
120117
{
121118
if (Logger.IsEnabled(LogLevel.Trace))
122119
{
123-
LogTransportReceivedMessageSensitive(Name, PipeReaderExtensions.GetUtf8String(line));
120+
LogTransportReceivedMessageSensitive(Name, EncodingUtilities.GetUtf8String(line));
124121
}
125122

126123
try
@@ -144,15 +141,15 @@ private async Task ProcessLineAsync(ReadOnlySequence<byte> line, CancellationTok
144141
{
145142
if (Logger.IsEnabled(LogLevel.Trace))
146143
{
147-
LogTransportMessageParseUnexpectedTypeSensitive(Name, PipeReaderExtensions.GetUtf8String(line));
144+
LogTransportMessageParseUnexpectedTypeSensitive(Name, EncodingUtilities.GetUtf8String(line));
148145
}
149146
}
150147
}
151148
catch (JsonException ex)
152149
{
153150
if (Logger.IsEnabled(LogLevel.Trace))
154151
{
155-
LogTransportMessageParseFailedSensitive(Name, PipeReaderExtensions.GetUtf8String(line), ex);
152+
LogTransportMessageParseFailedSensitive(Name, EncodingUtilities.GetUtf8String(line), ex);
156153
}
157154
else
158155
{

src/ModelContextProtocol.Core/Protocol/PipeReaderExtensions.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Buffers;
22
using System.IO.Pipelines;
3-
using System.Text;
43

54
namespace ModelContextProtocol.Protocol;
65

@@ -50,12 +49,6 @@ internal static async Task ReadLinesAsync(
5049
}
5150
}
5251

53-
/// <summary>Decodes a UTF-8 <see cref="ReadOnlySequence{T}"/> to a <see cref="string"/>.</summary>
54-
internal static string GetUtf8String(in ReadOnlySequence<byte> sequence) =>
55-
sequence.IsSingleSegment
56-
? Encoding.UTF8.GetString(sequence.First.Span)
57-
: Encoding.UTF8.GetString(sequence.ToArray());
58-
5952
private static bool EndsWithCarriageReturn(in ReadOnlySequence<byte> sequence)
6053
{
6154
if (sequence.IsSingleSegment)

src/ModelContextProtocol.Core/Server/StreamServerTransport.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private async Task ProcessLineAsync(ReadOnlySequence<byte> line, CancellationTok
115115
{
116116
if (Logger.IsEnabled(LogLevel.Trace))
117117
{
118-
LogTransportReceivedMessageSensitive(Name, PipeReaderExtensions.GetUtf8String(line));
118+
LogTransportReceivedMessageSensitive(Name, EncodingUtilities.GetUtf8String(line));
119119
}
120120

121121
try
@@ -139,15 +139,15 @@ private async Task ProcessLineAsync(ReadOnlySequence<byte> line, CancellationTok
139139
{
140140
if (Logger.IsEnabled(LogLevel.Trace))
141141
{
142-
LogTransportMessageParseUnexpectedTypeSensitive(Name, PipeReaderExtensions.GetUtf8String(line));
142+
LogTransportMessageParseUnexpectedTypeSensitive(Name, EncodingUtilities.GetUtf8String(line));
143143
}
144144
}
145145
}
146146
catch (JsonException ex)
147147
{
148148
if (Logger.IsEnabled(LogLevel.Trace))
149149
{
150-
LogTransportMessageParseFailedSensitive(Name, PipeReaderExtensions.GetUtf8String(line), ex);
150+
LogTransportMessageParseFailedSensitive(Name, EncodingUtilities.GetUtf8String(line), ex);
151151
}
152152
else
153153
{

0 commit comments

Comments
 (0)