Skip to content

Commit d1a3c20

Browse files
authored
Disable response compression for SSE responses (#208)
1 parent 3b26bf8 commit d1a3c20

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/ModelContextProtocol.AspNetCore/McpEndpointRouteBuilderExtensions.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Http.Features;
23
using Microsoft.AspNetCore.Routing;
34
using Microsoft.AspNetCore.WebUtilities;
45
using Microsoft.Extensions.DependencyInjection;
@@ -39,7 +40,7 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo
3940
var requestAborted = context.RequestAborted;
4041

4142
response.Headers.ContentType = "text/event-stream";
42-
response.Headers.CacheControl = "no-store";
43+
response.Headers.CacheControl = "no-cache,no-store";
4344

4445
var sessionId = MakeNewSessionId();
4546
await using var transport = new SseResponseStreamTransport(response.Body, $"/message?sessionId={sessionId}");
@@ -50,6 +51,10 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo
5051

5152
try
5253
{
54+
// Make sure we disable all response buffering for SSE
55+
context.Response.Headers.ContentEncoding = "identity";
56+
context.Features.GetRequiredFeature<IHttpResponseBodyFeature>().DisableBuffering();
57+
5358
var transportTask = transport.RunAsync(cancellationToken: requestAborted);
5459
await using var server = McpServerFactory.Create(transport, mcpServerOptions.Value, loggerFactory, endpoints.ServiceProvider);
5560

tests/ModelContextProtocol.Tests/SseServerIntegrationTests.cs

+15
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,21 @@ public async Task CallTool_Sse_EchoServer_Concurrently()
280280
}
281281
}
282282

283+
[Fact]
284+
public async Task EventSourceResponse_Includes_ExpectedHeaders()
285+
{
286+
using var httpClient = GetHttpClient();
287+
using var sseResponse = await httpClient.GetAsync("", HttpCompletionOption.ResponseHeadersRead, TestContext.Current.CancellationToken);
288+
289+
sseResponse.EnsureSuccessStatusCode();
290+
291+
Assert.Equal("text/event-stream", sseResponse.Content.Headers.ContentType?.MediaType);
292+
Assert.Equal("identity", sseResponse.Content.Headers.ContentEncoding.ToString());
293+
Assert.NotNull(sseResponse.Headers.CacheControl);
294+
Assert.True(sseResponse.Headers.CacheControl.NoStore);
295+
Assert.True(sseResponse.Headers.CacheControl.NoCache);
296+
}
297+
283298
[Fact]
284299
public async Task EventSourceStream_Includes_MessageEventType()
285300
{

0 commit comments

Comments
 (0)