Skip to content

Commit 477421b

Browse files
authored
Fixed SyntaxError with subscriptions from @apollo/client v4 (#8697)
1 parent b1e5db0 commit 477421b

File tree

5 files changed

+136
-58
lines changed

5 files changed

+136
-58
lines changed

dictionary.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ accessibilities
55
agrc
66
Alderaan
77
Andi
8+
ASPDEPR004
9+
ASPDEPR008
810
aspnetcore
911
Astromech
1012
automagically

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<PropertyGroup Condition="'$(TreatWarningsAsErrors)' == ''">
1515
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
16-
<WarningsNotAsErrors>NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors>
16+
<WarningsNotAsErrors>NU1901;NU1902;NU1903;NU1904;ASPDEPR004;ASPDEPR008</WarningsNotAsErrors>
1717
</PropertyGroup>
1818

1919
<PropertyGroup Condition="'$(TreatWarningsAsErrors)' == 'false'">

src/HotChocolate/Language/src/Language.Web/Utf8GraphQLRequestParser.cs

Lines changed: 30 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -235,82 +235,55 @@ private void ParseRequestProperty(ref Request request)
235235

236236
switch (fieldName[0])
237237
{
238-
case I:
239-
if (fieldName.SequenceEqual(IdProperty))
240-
{
241-
request.DocumentId = ParseOperationId();
242-
}
243-
238+
case I when fieldName.SequenceEqual(IdProperty):
239+
case D when fieldName.SequenceEqual(DocumentIdProperty):
240+
request.DocumentId = ParseOperationId();
244241
break;
245242

246-
case D:
247-
if (fieldName.SequenceEqual(DocumentIdProperty))
243+
case Q when fieldName.SequenceEqual(QueryProperty):
244+
var isNullOrEmpty = IsNullToken() || _reader.Value.Length == 0;
245+
request.ContainsDocument = !isNullOrEmpty;
246+
247+
if (request.ContainsDocument && _reader.Kind != TokenKind.String)
248248
{
249-
request.DocumentId = ParseOperationId();
249+
throw ThrowHelper.QueryMustBeStringOrNull(_reader);
250250
}
251251

252+
request.DocumentBody = _reader.Value;
253+
_reader.MoveNext();
252254
break;
253255

254-
case Q:
255-
if (fieldName.SequenceEqual(QueryProperty))
256-
{
257-
var isNullOrEmpty = IsNullToken() || _reader.Value.Length == 0;
258-
request.ContainsDocument = !isNullOrEmpty;
259-
260-
if (request.ContainsDocument && _reader.Kind != TokenKind.String)
261-
{
262-
throw ThrowHelper.QueryMustBeStringOrNull(_reader);
263-
}
264-
265-
request.DocumentBody = _reader.Value;
266-
_reader.MoveNext();
267-
}
268-
256+
case O when fieldName.SequenceEqual(OperationNameProperty):
257+
request.OperationName = ParseStringOrNull();
269258
break;
270259

271-
case O:
272-
if (fieldName.SequenceEqual(OperationNameProperty))
273-
{
274-
request.OperationName = ParseStringOrNull();
275-
}
260+
case O when fieldName.SequenceEqual(OnErrorProperty):
261+
var rawErrorHandlingMode = ParseStringOrNull();
276262

277-
if (fieldName.SequenceEqual(OnErrorProperty))
263+
if (rawErrorHandlingMode is not null)
278264
{
279-
var rawErrorHandlingMode = ParseStringOrNull();
280-
281-
if (rawErrorHandlingMode is not null)
265+
if (rawErrorHandlingMode.Equals("PROPAGATE", StringComparison.OrdinalIgnoreCase))
266+
{
267+
request.ErrorHandlingMode = ErrorHandlingMode.Propagate;
268+
}
269+
else if (rawErrorHandlingMode.Equals("NULL", StringComparison.OrdinalIgnoreCase))
270+
{
271+
request.ErrorHandlingMode = ErrorHandlingMode.Null;
272+
}
273+
else if (rawErrorHandlingMode.Equals("HALT", StringComparison.OrdinalIgnoreCase))
282274
{
283-
if (rawErrorHandlingMode.Equals("PROPAGATE", StringComparison.OrdinalIgnoreCase))
284-
{
285-
request.ErrorHandlingMode = ErrorHandlingMode.Propagate;
286-
}
287-
else if (rawErrorHandlingMode.Equals("NULL", StringComparison.OrdinalIgnoreCase))
288-
{
289-
request.ErrorHandlingMode = ErrorHandlingMode.Null;
290-
}
291-
else if (rawErrorHandlingMode.Equals("HALT", StringComparison.OrdinalIgnoreCase))
292-
{
293-
request.ErrorHandlingMode = ErrorHandlingMode.Halt;
294-
}
275+
request.ErrorHandlingMode = ErrorHandlingMode.Halt;
295276
}
296277
}
297278

298279
break;
299280

300-
case V:
301-
if (fieldName.SequenceEqual(VariablesProperty))
302-
{
303-
request.Variables = ParseVariables();
304-
}
305-
281+
case V when fieldName.SequenceEqual(VariablesProperty):
282+
request.Variables = ParseVariables();
306283
break;
307284

308-
case E:
309-
if (fieldName.SequenceEqual(ExtensionsProperty))
310-
{
311-
request.Extensions = ParseObjectOrNull();
312-
}
313-
285+
case E when fieldName.SequenceEqual(ExtensionsProperty):
286+
request.Extensions = ParseObjectOrNull();
314287
break;
315288

316289
default:

src/HotChocolate/Language/test/Language.Tests/Parser/GraphQLRequestParserTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,26 @@ public void Parse_Socket_Message()
566566
Utf8GraphQLRequestParser.ParseJson(message.Payload).MatchSnapshot();
567567
}
568568

569+
[Fact]
570+
public void Parse_Apollo_Client_v4_Query()
571+
{
572+
// arrange
573+
var requestData = """
574+
{
575+
"id": "foo",
576+
"query": "subscription OnEvent { fooChanged }",
577+
"operationName": "OnEvent",
578+
"operationType": "subscription"
579+
}
580+
"""u8;
581+
582+
// act
583+
var result = Utf8GraphQLRequestParser.Parse(requestData);
584+
585+
// assert
586+
result.MatchSnapshot();
587+
}
588+
569589
[Fact]
570590
public void Parse_Apollo_AQP_SignatureQuery()
571591
{
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
[
2+
{
3+
"DocumentId": {
4+
"IsEmpty": false,
5+
"Value": "foo"
6+
},
7+
"DocumentHash": null,
8+
"Document": {
9+
"Kind": "Document",
10+
"Location": {
11+
"Start": 0,
12+
"End": 35,
13+
"Line": 1,
14+
"Column": 1
15+
},
16+
"Definitions": [
17+
{
18+
"Kind": "OperationDefinition",
19+
"Location": {
20+
"Start": 0,
21+
"End": 35,
22+
"Line": 1,
23+
"Column": 1
24+
},
25+
"Name": {
26+
"Kind": "Name",
27+
"Location": {
28+
"Start": 13,
29+
"End": 22,
30+
"Line": 1,
31+
"Column": 14
32+
},
33+
"Value": "OnEvent"
34+
},
35+
"Description": null,
36+
"Operation": "Subscription",
37+
"VariableDefinitions": [],
38+
"Directives": [],
39+
"SelectionSet": {
40+
"Kind": "SelectionSet",
41+
"Location": {
42+
"Start": 21,
43+
"End": 35,
44+
"Line": 1,
45+
"Column": 22
46+
},
47+
"Selections": [
48+
{
49+
"Kind": "Field",
50+
"Alias": null,
51+
"Arguments": [],
52+
"SelectionSet": null,
53+
"Location": {
54+
"Start": 23,
55+
"End": 35,
56+
"Line": 1,
57+
"Column": 24
58+
},
59+
"Name": {
60+
"Kind": "Name",
61+
"Location": {
62+
"Start": 23,
63+
"End": 35,
64+
"Line": 1,
65+
"Column": 24
66+
},
67+
"Value": "fooChanged"
68+
},
69+
"Directives": []
70+
}
71+
]
72+
}
73+
}
74+
],
75+
"Count": 6,
76+
"FieldsCount": 1
77+
},
78+
"OperationName": "OnEvent",
79+
"ErrorHandlingMode": null,
80+
"Variables": null,
81+
"Extensions": null
82+
}
83+
]

0 commit comments

Comments
 (0)