@@ -32,7 +32,9 @@ public async ValueTask<bool> RunAsync(CancellationToken cancellationToken)
32
32
// The incomingChannel is null to handle the potential client GET request to handle unsolicited JsonRpcMessages.
33
33
if ( incomingChannel is not null )
34
34
{
35
- await OnPostBodyReceivedAsync ( httpBodies . Input , cancellationToken ) . ConfigureAwait ( false ) ;
35
+ var message = await JsonSerializer . DeserializeAsync ( httpBodies . Input . AsStream ( ) ,
36
+ McpJsonUtilities . JsonContext . Default . JsonRpcMessage , cancellationToken ) . ConfigureAwait ( false ) ;
37
+ await OnMessageReceivedAsync ( message , cancellationToken ) . ConfigureAwait ( false ) ;
36
38
}
37
39
38
40
if ( _pendingRequests . Count == 0 )
@@ -72,24 +74,6 @@ public async ValueTask DisposeAsync()
72
74
}
73
75
}
74
76
75
- private async ValueTask OnPostBodyReceivedAsync ( PipeReader streamableHttpRequestBody , CancellationToken cancellationToken )
76
- {
77
- if ( ! await IsJsonArrayAsync ( streamableHttpRequestBody , cancellationToken ) . ConfigureAwait ( false ) )
78
- {
79
- var message = await JsonSerializer . DeserializeAsync ( streamableHttpRequestBody . AsStream ( ) , McpJsonUtilities . JsonContext . Default . JsonRpcMessage , cancellationToken ) . ConfigureAwait ( false ) ;
80
- await OnMessageReceivedAsync ( message , cancellationToken ) . ConfigureAwait ( false ) ;
81
- }
82
- else
83
- {
84
- // Batched JSON-RPC message
85
- var messages = JsonSerializer . DeserializeAsyncEnumerable ( streamableHttpRequestBody . AsStream ( ) , McpJsonUtilities . JsonContext . Default . JsonRpcMessage , cancellationToken ) . ConfigureAwait ( false ) ;
86
- await foreach ( var message in messages . WithCancellation ( cancellationToken ) )
87
- {
88
- await OnMessageReceivedAsync ( message , cancellationToken ) . ConfigureAwait ( false ) ;
89
- }
90
- }
91
- }
92
-
93
77
private async ValueTask OnMessageReceivedAsync ( JsonRpcMessage ? message , CancellationToken cancellationToken )
94
78
{
95
79
if ( message is null )
@@ -108,27 +92,4 @@ private async ValueTask OnMessageReceivedAsync(JsonRpcMessage? message, Cancella
108
92
Throw . IfNull ( incomingChannel ) ;
109
93
await incomingChannel . WriteAsync ( message , cancellationToken ) . ConfigureAwait ( false ) ;
110
94
}
111
-
112
- private async ValueTask < bool > IsJsonArrayAsync ( PipeReader requestBody , CancellationToken cancellationToken )
113
- {
114
- // REVIEW: Should we bother trimming whitespace before checking for '['?
115
- var firstCharacterResult = await requestBody . ReadAtLeastAsync ( 1 , cancellationToken ) . ConfigureAwait ( false ) ;
116
-
117
- try
118
- {
119
- if ( firstCharacterResult . Buffer . Length == 0 )
120
- {
121
- return false ;
122
- }
123
-
124
- Span < byte > firstCharBuffer = stackalloc byte [ 1 ] ;
125
- firstCharacterResult . Buffer . Slice ( 0 , 1 ) . CopyTo ( firstCharBuffer ) ;
126
- return firstCharBuffer [ 0 ] == ( byte ) '[' ;
127
- }
128
- finally
129
- {
130
- // Never consume data when checking for '['. System.Text.Json still needs to consume it.
131
- requestBody . AdvanceTo ( firstCharacterResult . Buffer . Start ) ;
132
- }
133
- }
134
95
}
0 commit comments