Skip to content

Commit d551f87

Browse files
authored
Merge pull request #727 from microsoft/mk/fix-parsing-errors
Catch any OpenApiExceptions thrown during parsing and continue processing Schema Components
2 parents f9b8375 + fa45d12 commit d551f87

File tree

5 files changed

+69
-17
lines changed

5 files changed

+69
-17
lines changed

src/Microsoft.OpenApi.Readers/ParsingContext.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ internal OpenApiDocument Parse(YamlDocument yamlDocument)
6060
switch (inputVersion)
6161
{
6262
case string version when version == "2.0":
63-
VersionService = new OpenApiV2VersionService();
63+
VersionService = new OpenApiV2VersionService(Diagnostic);
6464
doc = VersionService.LoadDocument(RootNode);
6565
this.Diagnostic.SpecificationVersion = OpenApiSpecVersion.OpenApi2_0;
6666
break;
6767

6868
case string version when version.StartsWith("3.0"):
69-
VersionService = new OpenApiV3VersionService();
69+
VersionService = new OpenApiV3VersionService(Diagnostic);
7070
doc = VersionService.LoadDocument(RootNode);
7171
this.Diagnostic.SpecificationVersion = OpenApiSpecVersion.OpenApi3_0;
7272
break;
@@ -93,12 +93,12 @@ internal T ParseFragment<T>(YamlDocument yamlDocument, OpenApiSpecVersion versio
9393
switch (version)
9494
{
9595
case OpenApiSpecVersion.OpenApi2_0:
96-
VersionService = new OpenApiV2VersionService();
96+
VersionService = new OpenApiV2VersionService(Diagnostic);
9797
element = this.VersionService.LoadElement<T>(node);
9898
break;
9999

100100
case OpenApiSpecVersion.OpenApi3_0:
101-
this.VersionService = new OpenApiV3VersionService();
101+
this.VersionService = new OpenApiV3VersionService(Diagnostic);
102102
element = this.VersionService.LoadElement<T>(node);
103103
break;
104104
}

src/Microsoft.OpenApi.Readers/V2/OpenApiV2VersionService.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ namespace Microsoft.OpenApi.Readers.V2
2020
/// </summary>
2121
internal class OpenApiV2VersionService : IOpenApiVersionService
2222
{
23+
public OpenApiDiagnostic Diagnostic { get; }
24+
25+
/// <summary>
26+
/// Create Parsing Context
27+
/// </summary>
28+
/// <param name="diagnostic">Provide instance for diagnotic object for collecting and accessing information about the parsing.</param>
29+
public OpenApiV2VersionService(OpenApiDiagnostic diagnostic)
30+
{
31+
Diagnostic = diagnostic;
32+
}
33+
2334
private IDictionary<Type, Func<ParseNode, object>> _loaders = new Dictionary<Type, Func<ParseNode, object>>
2435
{
2536
[typeof(IOpenApiAny)] = OpenApiV2Deserializer.LoadAny,
@@ -154,7 +165,15 @@ public OpenApiReference ConvertToOpenApiReference(string reference, ReferenceTyp
154165
if (reference.StartsWith("#"))
155166
{
156167
// "$ref": "#/definitions/Pet"
157-
return ParseLocalReference(segments[1]);
168+
try
169+
{
170+
return ParseLocalReference(segments[1]);
171+
}
172+
catch (OpenApiException ex)
173+
{
174+
Diagnostic.Errors.Add(new OpenApiError(ex));
175+
return null;
176+
}
158177
}
159178

160179
// $ref: externalSource.yaml#/Pet

src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) Microsoft Corporation. All rights reserved.
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

44
using System;
@@ -19,6 +19,17 @@ namespace Microsoft.OpenApi.Readers.V3
1919
/// </summary>
2020
internal class OpenApiV3VersionService : IOpenApiVersionService
2121
{
22+
public OpenApiDiagnostic Diagnostic { get; }
23+
24+
/// <summary>
25+
/// Create Parsing Context
26+
/// </summary>
27+
/// <param name="diagnostic">Provide instance for diagnotic object for collecting and accessing information about the parsing.</param>
28+
public OpenApiV3VersionService(OpenApiDiagnostic diagnostic)
29+
{
30+
Diagnostic = diagnostic;
31+
}
32+
2233
private IDictionary<Type, Func<ParseNode, object>> _loaders = new Dictionary<Type, Func<ParseNode, object>>
2334
{
2435
[typeof(IOpenApiAny)] = OpenApiV3Deserializer.LoadAny,
@@ -88,7 +99,15 @@ public OpenApiReference ConvertToOpenApiReference(
8899
if (reference.StartsWith("#"))
89100
{
90101
// "$ref": "#/components/schemas/Pet"
91-
return ParseLocalReference(segments[1]);
102+
try
103+
{
104+
return ParseLocalReference(segments[1]);
105+
}
106+
catch (OpenApiException ex)
107+
{
108+
Diagnostic.Errors.Add(new OpenApiError(ex));
109+
return null;
110+
}
92111
}
93112
// Where fragments point into a non-OpenAPI document, the id will be the complete fragment identifier
94113
string id = segments[1];

test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ namespace Microsoft.OpenApi.Readers.Tests
1010
{
1111
public class ConvertToOpenApiReferenceV2Tests
1212
{
13+
public OpenApiDiagnostic Diagnostic{get;}
14+
15+
public ConvertToOpenApiReferenceV2Tests()
16+
{
17+
Diagnostic = new OpenApiDiagnostic();
18+
}
1319

1420
[Fact]
1521
public void ParseExternalReference()
1622
{
1723
// Arrange
18-
var versionService = new OpenApiV2VersionService();
24+
var versionService = new OpenApiV2VersionService(Diagnostic);
1925
var externalResource = "externalSchema.json";
2026
var id = "externalPathSegment1/externalPathSegment2/externalPathSegment3";
2127
var input = $"{externalResource}#/{id}";
@@ -33,7 +39,7 @@ public void ParseExternalReference()
3339
public void ParseLocalParameterReference()
3440
{
3541
// Arrange
36-
var versionService = new OpenApiV2VersionService();
42+
var versionService = new OpenApiV2VersionService(Diagnostic);
3743
var referenceType = ReferenceType.Parameter;
3844
var id = "parameterId";
3945
var input = $"#/parameters/{id}";
@@ -51,7 +57,7 @@ public void ParseLocalParameterReference()
5157
public void ParseLocalSchemaReference()
5258
{
5359
// Arrange
54-
var versionService = new OpenApiV2VersionService();
60+
var versionService = new OpenApiV2VersionService(Diagnostic);
5561
var referenceType = ReferenceType.Schema;
5662
var id = "parameterId";
5763
var input = $"#/definitions/{id}";
@@ -69,7 +75,7 @@ public void ParseLocalSchemaReference()
6975
public void ParseTagReference()
7076
{
7177
// Arrange
72-
var versionService = new OpenApiV2VersionService();
78+
var versionService = new OpenApiV2VersionService(Diagnostic);
7379
var referenceType = ReferenceType.Tag;
7480
var id = "tagId";
7581
var input = $"{id}";
@@ -87,7 +93,7 @@ public void ParseTagReference()
8793
public void ParseSecuritySchemeReference()
8894
{
8995
// Arrange
90-
var versionService = new OpenApiV2VersionService();
96+
var versionService = new OpenApiV2VersionService(Diagnostic);
9197
var referenceType = ReferenceType.SecurityScheme;
9298
var id = "securitySchemeId";
9399
var input = $"{id}";

test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,20 @@ namespace Microsoft.OpenApi.Readers.Tests
1010
{
1111
public class ConvertToOpenApiReferenceV3Tests
1212
{
13+
public OpenApiDiagnostic Diagnostic { get; }
14+
15+
public ConvertToOpenApiReferenceV3Tests()
16+
{
17+
Diagnostic = new OpenApiDiagnostic();
18+
}
19+
20+
1321

1422
[Fact]
1523
public void ParseExternalReference()
1624
{
1725
// Arrange
18-
var versionService = new OpenApiV3VersionService();
26+
var versionService = new OpenApiV3VersionService(Diagnostic);
1927
var externalResource = "externalSchema.json";
2028
var id = "/externalPathSegment1/externalPathSegment2/externalPathSegment3";
2129
var input = $"{externalResource}#{id}";
@@ -33,7 +41,7 @@ public void ParseExternalReference()
3341
public void ParseLocalParameterReference()
3442
{
3543
// Arrange
36-
var versionService = new OpenApiV3VersionService();
44+
var versionService = new OpenApiV3VersionService(Diagnostic);
3745
var referenceType = ReferenceType.Parameter;
3846
var id = "parameterId";
3947
var input = $"#/components/parameters/{id}";
@@ -51,7 +59,7 @@ public void ParseLocalParameterReference()
5159
public void ParseLocalSchemaReference()
5260
{
5361
// Arrange
54-
var versionService = new OpenApiV3VersionService();
62+
var versionService = new OpenApiV3VersionService(Diagnostic);
5563
var referenceType = ReferenceType.Schema;
5664
var id = "schemaId";
5765
var input = $"#/components/schemas/{id}";
@@ -69,7 +77,7 @@ public void ParseLocalSchemaReference()
6977
public void ParseTagReference()
7078
{
7179
// Arrange
72-
var versionService = new OpenApiV3VersionService();
80+
var versionService = new OpenApiV3VersionService(Diagnostic);
7381
var referenceType = ReferenceType.Tag;
7482
var id = "tagId";
7583
var input = $"{id}";
@@ -87,7 +95,7 @@ public void ParseTagReference()
8795
public void ParseSecuritySchemeReference()
8896
{
8997
// Arrange
90-
var versionService = new OpenApiV3VersionService();
98+
var versionService = new OpenApiV3VersionService(Diagnostic);
9199
var referenceType = ReferenceType.SecurityScheme;
92100
var id = "securitySchemeId";
93101
var input = $"{id}";

0 commit comments

Comments
 (0)