From 4188bd5b3877f7badb951b421cf66e0af2eacb22 Mon Sep 17 00:00:00 2001 From: Arthur Khashaev Date: Sat, 30 Jul 2022 01:02:06 +0300 Subject: [PATCH] Fix infinite recursion in type definition parser Fixes #637. --- language/parser/parser.go | 12 ++++-------- language/parser/parser_test.go | 9 +++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/language/parser/parser.go b/language/parser/parser.go index 4ee1577c..291d9f39 100644 --- a/language/parser/parser.go +++ b/language/parser/parser.go @@ -19,12 +19,6 @@ var tokenDefinitionFn map[string]parseDefinitionFn func init() { tokenDefinitionFn = make(map[string]parseDefinitionFn) { - // for sign - tokenDefinitionFn[lexer.BRACE_L.String()] = parseOperationDefinition - tokenDefinitionFn[lexer.STRING.String()] = parseTypeSystemDefinition - tokenDefinitionFn[lexer.BLOCK_STRING.String()] = parseTypeSystemDefinition - tokenDefinitionFn[lexer.NAME.String()] = parseTypeSystemDefinition - // for NAME tokenDefinitionFn[lexer.FRAGMENT] = parseFragmentDefinition tokenDefinitionFn[lexer.QUERY] = parseOperationDefinition tokenDefinitionFn[lexer.MUTATION] = parseOperationDefinition @@ -145,8 +139,10 @@ func parseDocument(parser *Parser) (*ast.Document, error) { break } switch kind := parser.Token.Kind; kind { - case lexer.BRACE_L, lexer.NAME, lexer.STRING, lexer.BLOCK_STRING: - item = tokenDefinitionFn[kind.String()] + case lexer.BRACE_L: + item = parseOperationDefinition + case lexer.NAME, lexer.STRING, lexer.BLOCK_STRING: + item = parseTypeSystemDefinition default: return nil, unexpected(parser, lexer.Token{}) } diff --git a/language/parser/parser_test.go b/language/parser/parser_test.go index 3cc4253a..8f0e0715 100644 --- a/language/parser/parser_test.go +++ b/language/parser/parser_test.go @@ -736,6 +736,15 @@ func TestParseCreatesAst(t *testing.T) { } +func TestDoesNotAcceptStringAsDefinition(t *testing.T) { + test := errorMessageTest{ + `String`, + `Syntax Error GraphQL (1:1) Unexpected Name "String"`, + false, + } + testErrorMessage(t, test) +} + type errorMessageTest struct { source interface{} expectedMessage string