diff --git a/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs b/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs index 8d9c67b7733..1e04eb13ce6 100644 --- a/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs +++ b/src/HotChocolate/Core/test/Execution.Tests/RequestExecutorTests.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Tests; using HotChocolate.Types; using Microsoft.Extensions.DependencyInjection; @@ -94,6 +95,35 @@ public async Task CancellationToken_Is_Passed_Correctly() Assert.True(tokenWasCorrectlyPassedToResolver); } + [Fact] + public async Task DeleteChar_StringInput_IsAllowed() + { + var schema = SchemaBuilder.New() + .AddQueryType(t => t + .Name("Query") + .Field("echo") + .Argument("arg", arg => arg.Type()) + .Resolve(x => x.ArgumentValue("arg"))) + .Create(); + + // act + var executor = schema.MakeExecutable(); + var result = await executor.ExecuteAsync($$"""" + { + delChar: echo(arg: "\u007F") + delCharNonEscaped: echo(arg: "{{"\u007f"}}") + delCharNonEscapedBlockString: echo(arg: + """ + {{"\u007f"}} + """) + #Comment with del char -> {{"\u007f"}} <- + } + """"); + + // assert + result.MatchSnapshot(); + } + [Fact] public async Task Ensure_Errors_Do_Not_Result_In_Timeouts() { diff --git a/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.DeleteChar_StringInput_IsAllowed.snap b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.DeleteChar_StringInput_IsAllowed.snap new file mode 100644 index 00000000000..9c647232108 --- /dev/null +++ b/src/HotChocolate/Core/test/Execution.Tests/__snapshots__/RequestExecutorTests.DeleteChar_StringInput_IsAllowed.snap @@ -0,0 +1,7 @@ +{ + "data": { + "delChar": "\u007F", + "delCharNonEscaped": "\u007F", + "delCharNonEscapedBlockString": "\u007F\n" + } +} diff --git a/src/HotChocolate/Language/src/Language.Utf8/GraphQLConstants.cs b/src/HotChocolate/Language/src/Language.Utf8/GraphQLConstants.cs index f1dd7b10255..2f03ce3976a 100644 --- a/src/HotChocolate/Language/src/Language.Utf8/GraphQLConstants.cs +++ b/src/HotChocolate/Language/src/Language.Utf8/GraphQLConstants.cs @@ -43,7 +43,6 @@ internal static class GraphQLConstants public const byte GroupSeparator = 29; public const byte RecordSeparator = 30; public const byte UnitSeparator = 31; - public const byte Delete = 127; public const byte A = (byte)'a'; public const byte B = (byte)'b'; diff --git a/src/HotChocolate/Language/src/Language.Utf8/Utf8GraphQLReader.cs b/src/HotChocolate/Language/src/Language.Utf8/Utf8GraphQLReader.cs index 87966bc2d7c..3b82ffddb1f 100644 --- a/src/HotChocolate/Language/src/Language.Utf8/Utf8GraphQLReader.cs +++ b/src/HotChocolate/Language/src/Language.Utf8/Utf8GraphQLReader.cs @@ -486,7 +486,6 @@ private void ReadCommentToken() case GraphQLConstants.GroupSeparator: case GraphQLConstants.RecordSeparator: case GraphQLConstants.UnitSeparator: - case GraphQLConstants.Delete: run = false; break; @@ -581,7 +580,6 @@ private void ReadStringValueToken() case GraphQLConstants.GroupSeparator: case GraphQLConstants.RecordSeparator: case GraphQLConstants.UnitSeparator: - case GraphQLConstants.Delete: throw new SyntaxException(this, InvalidCharacterWithinString, code); } } @@ -674,7 +672,6 @@ private void ReadBlockStringToken() case GraphQLConstants.GroupSeparator: case GraphQLConstants.RecordSeparator: case GraphQLConstants.UnitSeparator: - case GraphQLConstants.Delete: throw new SyntaxException( this, string.Format(InvalidCharacterWithinString, code));