swagger-api / swagger-api/swagger-parser
Confusing log warning `SnakeException: Exception safe-checking yaml content` when string schema's pattern property has regular expression with syntax error
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 867
- Forks
- 560
- Avg merge
- 2d 21h
- Merged PRs (30d)
- 7
Description
When using the swagger parser, we received the below log warning message[2] when we have a pattern regular value with syntax errors[1]. This error log is kind of confusing at a glance it looks like the tool was crashing.
I wonder whether we can have any simple detailed error message for this instead of this warning.
Using swaggerParserVersion=2.1.10
[1] openapi-spec
openapi: 3.0.1
info:
...
servers:
...
paths:
/greeting:
...
components:
schemas:
Person:
type: object
required:
- id
properties:
name:
type: string
pattern: "[a-zA-Z0-9,\\.\']"
hobby:
type: array
items:
type: string
[2] Log warning
May 09, 2023 1:51:21 PM io.swagger.v3.parser.util.DeserializationUtils readYamlTree
WARNING: Error snake-parsing yaml content
io.swagger.v3.parser.util.DeserializationUtils$SnakeException: Exception safe-checking yaml content (maxDepth 2000, maxYamlAliasesForCollections 2147483647)
at io.swagger.v3.parser.util.DeserializationUtils$CustomSnakeYamlConstructor.getSingleData(DeserializationUtils.java:438)
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:477)
at org.yaml.snakeyaml.Yaml.load(Yaml.java:406)
at io.swagger.v3.parser.util.DeserializationUtils.readYamlTree(DeserializationUtils.java:211)
at io.swagger.v3.parser.util.DeserializationUtils.deserializeIntoTree(DeserializationUtils.java:143)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:168)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:107)
at io.swagger.parser.OpenAPIParser.readContents(OpenAPIParser.java:29)
at io.ballerina.openapi.core.GeneratorUtils.getOpenAPIFromOpenAPIV3Parser(GeneratorUtils.java:436)
at io.ballerina.openapi.core.GeneratorUtils.normalizeOpenAPI(GeneratorUtils.java:734)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClientFiles(BallerinaCodeGenerator.java:333)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClient(BallerinaCodeGenerator.java:215)
at io.ballerina.openapi.cmd.OpenApiCmd.generatesClientFile(OpenApiCmd.java:355)
at io.ballerina.openapi.cmd.OpenApiCmd.openApiToBallerina(OpenApiCmd.java:283)
at io.ballerina.openapi.cmd.OpenApiCmd.execute(OpenApiCmd.java:183)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.ballerina.cli.launcher.Main.main(Main.java:51)
Caused by: while scanning a double-quoted scalar
in 'string', line 71, column 20:
pattern: "[a-zA-Z0-9,\\.\']"
^
found unknown escape character '(39)
in 'string', line 71, column 36:
pattern: "[a-zA-Z0-9,\\.\']"
^
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalarNonSpaces(ScannerImpl.java:1962)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalar(ScannerImpl.java:1895)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchFlowScalar(ScannerImpl.java:1075)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDouble(ScannerImpl.java:1057)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:445)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:256)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:680)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:171)
at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:136)
at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:116)
at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:221)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:190)
at org.yaml.snakeyaml.composer.Composer.composeKeyNode(Composer.java:317)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:308)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:116)
at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:142)
at io.swagger.v3.parser.util.DeserializationUtils$CustomSnakeYamlConstructor.getSingleData(DeserializationUtils.java:415)
... 16 more
May 09, 2023 1:51:21 PM io.swagger.v3.parser.util.DeserializationUtils readYamlTree
SEVERE: Error parsing content
com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.MarkedYAMLException: while scanning a double-quoted scalar
in 'reader', line 71, column 20:
pattern: "[a-zA-Z0-9,\\.\']"
^
found unknown escape character '(39)
in 'reader', line 71, column 36:
pattern: "[a-zA-Z0-9,\\.\']"
^
at [Source: (StringReader); line: 71, column: 18]
at com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.MarkedYAMLException.from(MarkedYAMLException.java:28)
at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:407)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer._deserializeContainerNoRecursion(JsonNodeDeserializer.java:539)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:98)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:23)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4772)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:3124)
at io.swagger.v3.parser.util.DeserializationUtils.readYamlTree(DeserializationUtils.java:232)
at io.swagger.v3.parser.util.DeserializationUtils.deserializeIntoTree(DeserializationUtils.java:143)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:168)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:107)
at io.swagger.parser.OpenAPIParser.readContents(OpenAPIParser.java:29)
at io.ballerina.openapi.core.GeneratorUtils.getOpenAPIFromOpenAPIV3Parser(GeneratorUtils.java:436)
at io.ballerina.openapi.core.GeneratorUtils.normalizeOpenAPI(GeneratorUtils.java:734)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClientFiles(BallerinaCodeGenerator.java:333)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClient(BallerinaCodeGenerator.java:215)
at io.ballerina.openapi.cmd.OpenApiCmd.generatesClientFile(OpenApiCmd.java:355)
at io.ballerina.openapi.cmd.OpenApiCmd.openApiToBallerina(OpenApiCmd.java:283)
at io.ballerina.openapi.cmd.OpenApiCmd.execute(OpenApiCmd.java:183)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.ballerina.cli.launcher.Main.main(Main.java:51)
Caused by: while scanning a double-quoted scalar
in 'reader', line 71, column 20:
pattern: "[a-zA-Z0-9,\\.\']"
^
found unknown escape character '(39)
in 'reader', line 71, column 36:
pattern: "[a-zA-Z0-9,\\.\']"
^
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalarNonSpaces(ScannerImpl.java:1962)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalar(ScannerImpl.java:1895)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchFlowScalar(ScannerImpl.java:1075)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDouble(ScannerImpl.java:1057)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:445)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:256)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:680)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:171)
at org.yaml.snakeyaml.parser.ParserImpl.getEvent(ParserImpl.java:181)
at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:403)
... 20 more
May 09, 2023 1:51:21 PM io.swagger.v3.parser.OpenAPIV3Parser readContents
WARNING: Exception while parsing:
com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.MarkedYAMLException: while scanning a double-quoted scalar
in 'reader', line 71, column 20:
pattern: "[a-zA-Z0-9,\\.\']"
^
found unknown escape character '(39)
in 'reader', line 71, column 36:
pattern: "[a-zA-Z0-9,\\.\']"
^
at [Source: (StringReader); line: 71, column: 18]
at com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.MarkedYAMLException.from(MarkedYAMLException.java:28)
at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:407)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer._deserializeContainerNoRecursion(JsonNodeDeserializer.java:539)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:98)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:23)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4772)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:3124)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:170)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:107)
at io.swagger.parser.OpenAPIParser.readContents(OpenAPIParser.java:29)
at io.ballerina.openapi.core.GeneratorUtils.getOpenAPIFromOpenAPIV3Parser(GeneratorUtils.java:436)
at io.ballerina.openapi.core.GeneratorUtils.normalizeOpenAPI(GeneratorUtils.java:734)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClientFiles(BallerinaCodeGenerator.java:333)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClient(BallerinaCodeGenerator.java:215)
at io.ballerina.openapi.cmd.OpenApiCmd.generatesClientFile(OpenApiCmd.java:355)
at io.ballerina.openapi.cmd.OpenApiCmd.openApiToBallerina(OpenApiCmd.java:283)
at io.ballerina.openapi.cmd.OpenApiCmd.execute(OpenApiCmd.java:183)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.ballerina.cli.launcher.Main.main(Main.java:51)
Caused by: while scanning a double-quoted scalar
in 'reader', line 71, column 20:
pattern: "[a-zA-Z0-9,\\.\']"
^
found unknown escape character '(39)
in 'reader', line 71, column 36:
pattern: "[a-zA-Z0-9,\\.\']"
^
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalarNonSpaces(ScannerImpl.java:1962)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalar(ScannerImpl.java:1895)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchFlowScalar(ScannerImpl.java:1075)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDouble(ScannerImpl.java:1057)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:445)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:256)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:680)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:171)
at org.yaml.snakeyaml.parser.ParserImpl.getEvent(ParserImpl.java:181)
at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:403)
... 18 more
May 09, 2023 1:51:21 PM io.swagger.parser.util.DeserializationUtils readYamlTree
WARNING: Error snake-parsing yaml content
io.swagger.parser.util.DeserializationUtils$SnakeException: Exception safe-checking yaml content (maxDepth 2000, maxYamlAliasesForCollections 2147483647)
at io.swagger.parser.util.DeserializationUtils$CustomSnakeYamlConstructor.getSingleData(DeserializationUtils.java:402)
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:477)
at org.yaml.snakeyaml.Yaml.load(Yaml.java:406)
at io.swagger.parser.util.DeserializationUtils.readYamlTree(DeserializationUtils.java:220)
at io.swagger.parser.SwaggerParser.deserializeYaml(SwaggerParser.java:124)
at io.swagger.parser.SwaggerParser.readWithInfo(SwaggerParser.java:137)
at io.swagger.v3.parser.converter.SwaggerConverter.readContents(SwaggerConverter.java:97)
at io.swagger.parser.OpenAPIParser.readContents(OpenAPIParser.java:29)
at io.ballerina.openapi.core.GeneratorUtils.getOpenAPIFromOpenAPIV3Parser(GeneratorUtils.java:436)
at io.ballerina.openapi.core.GeneratorUtils.normalizeOpenAPI(GeneratorUtils.java:734)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClientFiles(BallerinaCodeGenerator.java:333)
at io.ballerina.openapi.cmd.BallerinaCodeGenerator.generateClient(BallerinaCodeGenerator.java:215)
at io.ballerina.openapi.cmd.OpenApiCmd.generatesClientFile(OpenApiCmd.java:355)
at io.ballerina.openapi.cmd.OpenApiCmd.openApiToBallerina(OpenApiCmd.java:283)
at io.ballerina.openapi.cmd.OpenApiCmd.execute(OpenApiCmd.java:183)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.ballerina.cli.launcher.Main.main(Main.java:51)
Caused by: while scanning a double-quoted scalar
in 'string', line 71, column 20:
pattern: "[a-zA-Z0-9,\\.\']"
^
found unknown escape character '(39)
in 'string', line 71, column 36:
pattern: "[a-zA-Z0-9,\\.\']"
^
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalarNonSpaces(ScannerImpl.java:1962)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanFlowScalar(ScannerImpl.java:1895)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchFlowScalar(ScannerImpl.java:1075)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDouble(ScannerImpl.java:1057)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:445)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:256)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:680)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:171)
at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:136)
at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:116)
at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:221)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:190)
at org.yaml.snakeyaml.composer.Composer.composeKeyNode(Composer.java:317)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:308)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:321)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:312)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:293)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:194)
at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:116)
at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:142)
at io.swagger.parser.util.DeserializationUtils$CustomSnakeYamlConstructor.getSingleData(DeserializationUtils.java:381)
... 16 more
OpenAPI definition has errors:
malformed or unreadable swagger supplied
attribute openapi is not of type `object`
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in DeserializationUtils.readYamlTree, especially the path shown in DeserializationUtils.java:438, and trace how OpenAPIV3Parser.readContents reports YAML parsing failures. Reproduce the example with the malformed pattern value, then verify that the resulting warning clearly identifies the parsing problem without appearing to indicate a tool crash.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- api
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100