diff --git a/src/StrawberryShake/Client/src/Transport.Http/ResponseEnumerable.cs b/src/StrawberryShake/Client/src/Transport.Http/ResponseEnumerable.cs index ee687ff9596..e5535cb1ea6 100644 --- a/src/StrawberryShake/Client/src/Transport.Http/ResponseEnumerable.cs +++ b/src/StrawberryShake/Client/src/Transport.Http/ResponseEnumerable.cs @@ -1,6 +1,6 @@ +using System.IO.Pipelines; using System.Runtime.CompilerServices; using System.Text.Json; -using HotChocolate.Buffers; using HotChocolate.Transport.Http; using StrawberryShake.Internal; using static StrawberryShake.Properties.Resources; @@ -88,8 +88,8 @@ public async IAsyncEnumerator> GetAsyncEnumerator( return null; } - using var buffer = new PooledArrayWriter(); - using var writer = new Utf8JsonWriter(buffer); + var pipe = new Pipe(); + using var writer = new Utf8JsonWriter(pipe.Writer); writer.WriteStartObject(); WriteProperty(writer, "data", result.Data); @@ -111,8 +111,9 @@ public async IAsyncEnumerator> GetAsyncEnumerator( writer.WriteEndObject(); writer.Flush(); + pipe.Writer.Complete(); - return JsonDocument.Parse(buffer.GetWrittenMemory()); + return JsonDocument.Parse(pipe.Reader.AsStream()); } private static void WriteProperty(Utf8JsonWriter writer, string propertyName, JsonElement value) diff --git a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/AnyScalarDefaultSerializationTest.cs b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/AnyScalarDefaultSerializationTest.cs index e05ab56d0c9..af83b029d14 100644 --- a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/AnyScalarDefaultSerializationTest.cs +++ b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/AnyScalarDefaultSerializationTest.cs @@ -44,10 +44,51 @@ public async Task Execute_AnyScalarDefaultSerialization_Test() result.Data?.Json.ToString().MatchSnapshot(); } + [Fact] + public async Task Execute_AnyScalarDefaultSerialization_TestLarge() + { + // arrange + using var cts = new CancellationTokenSource(20_000); + using var host = TestServerHelper.CreateServer( + builder => + { + builder.AddTypeExtension(); + }, + out var port); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddHttpClient( + AnyScalarDefaultSerializationClient.ClientName, + c => c.BaseAddress = new Uri("http://localhost:" + port + "/graphql")); + serviceCollection.AddWebSocketClient( + AnyScalarDefaultSerializationClient.ClientName, + c => c.Uri = new Uri("ws://localhost:" + port + "/graphql")); + serviceCollection.AddAnyScalarDefaultSerializationClient(); + IServiceProvider services = serviceCollection.BuildServiceProvider(); + var client = + services.GetRequiredService(); + + // act + IOperationResult result = await client.GetJson.ExecuteAsync(cts.Token); + + // assert + Assert.Empty(result.Errors); + result.Data?.Json.ToString().MatchSnapshot(); + } + [ExtendObjectType(OperationTypeNames.Query)] public class QueryResolvers { [GraphQLType(typeof(NonNullType))] public Dictionary GetJson() => new() { { "abc", "def" } }; } + + [ExtendObjectType(OperationTypeNames.Query)] + public class LargeQueryResolvers + { + [GraphQLType(typeof(NonNullType))] + public string[] GetJson() => [ + $"{0,10000}", + $"{1,10000}", + ]; + } } diff --git a/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/__snapshots__/AnyScalarDefaultSerializationTest.Execute_AnyScalarDefaultSerialization_TestLarge.snap b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/__snapshots__/AnyScalarDefaultSerializationTest.Execute_AnyScalarDefaultSerialization_TestLarge.snap new file mode 100644 index 00000000000..46a21afc6e2 --- /dev/null +++ b/src/StrawberryShake/CodeGeneration/test/CodeGeneration.CSharp.Tests/Integration/__snapshots__/AnyScalarDefaultSerializationTest.Execute_AnyScalarDefaultSerialization_TestLarge.snap @@ -0,0 +1 @@ +[" 0"," 1"]