@@ -32,7 +32,9 @@ public async ValueTask<bool> RunAsync(CancellationToken cancellationToken)
3232 // The incomingChannel is null to handle the potential client GET request to handle unsolicited JsonRpcMessages.
3333 if ( incomingChannel is not null )
3434 {
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 ) ;
3638 }
3739
3840 if ( _pendingRequests . Count == 0 )
@@ -72,24 +74,6 @@ public async ValueTask DisposeAsync()
7274 }
7375 }
7476
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-
9377 private async ValueTask OnMessageReceivedAsync ( JsonRpcMessage ? message , CancellationToken cancellationToken )
9478 {
9579 if ( message is null )
@@ -108,27 +92,4 @@ private async ValueTask OnMessageReceivedAsync(JsonRpcMessage? message, Cancella
10892 Throw . IfNull ( incomingChannel ) ;
10993 await incomingChannel . WriteAsync ( message , cancellationToken ) . ConfigureAwait ( false ) ;
11094 }
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- }
13495}
0 commit comments