Skip to content

Commit f818b95

Browse files
committed
apis.guru does not throw any exceptions
1 parent c340f61 commit f818b95

File tree

12 files changed

+99
-17
lines changed

12 files changed

+99
-17
lines changed

src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
7575
var resolver = new OpenApiReferenceResolver(document);
7676
var walker = new OpenApiWalker(resolver);
7777
walker.Walk(document);
78+
foreach (var item in resolver.Errors)
79+
{
80+
diagnostic.Errors.Add(item);
81+
}
7882
break;
7983
case ReferenceResolutionSetting.DoNotResolveReferences:
8084
break;

src/Microsoft.OpenApi.Readers/ParseNodes/ListNode.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,10 @@ public override IOpenApiAny CreateAny()
7474

7575
return array;
7676
}
77+
78+
//public override string GetScalarValue()
79+
//{
80+
// throw new OpenApiException()
81+
//}
7782
}
7883
}

src/Microsoft.OpenApi.Readers/ParseNodes/ParseNode.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ public MapNode CheckMapNode(string nodeName)
3131
var mapNode = this as MapNode;
3232
if (mapNode == null)
3333
{
34-
Diagnostic.Errors.Add(
35-
new OpenApiError("", $"{nodeName} must be a map/object at " + Context.GetLocation()));
34+
throw new OpenApiException($"{nodeName} must be a map/object");
35+
//Diagnostic.Errors.Add(
36+
// new OpenApiError("", $"{nodeName} must be a map/object at " + Context.GetLocation()));
3637
}
3738

3839
return mapNode;

src/Microsoft.OpenApi.Readers/ParseNodes/ValueNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public override IOpenApiAny CreateAny()
6666
dblValue); // Note(darrmi): This may be better as decimal. Further investigation required.
6767
}
6868

69-
if (DateTime.TryParse(value, out var datetimeValue))
69+
if (DateTimeOffset.TryParse(value, out var datetimeValue))
7070
{
7171
return new OpenApiDateTime(datetimeValue);
7272
}

src/Microsoft.OpenApi.Readers/Services/OpenApiReferenceResolver.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7+
using Microsoft.OpenApi.Exceptions;
78
using Microsoft.OpenApi.Interfaces;
89
using Microsoft.OpenApi.Models;
910
using Microsoft.OpenApi.Services;
@@ -17,13 +18,22 @@ internal class OpenApiReferenceResolver : OpenApiVisitorBase
1718
{
1819
private OpenApiDocument _currentDocument;
1920
private bool _resolveRemoteReferences;
21+
private List<OpenApiError> _errors = new List<OpenApiError>();
2022

2123
public OpenApiReferenceResolver(OpenApiDocument currentDocument, bool resolveRemoteReferences = true)
2224
{
2325
_currentDocument = currentDocument;
2426
_resolveRemoteReferences = resolveRemoteReferences;
2527
}
2628

29+
public IEnumerable<OpenApiError> Errors
30+
{
31+
get
32+
{
33+
return _errors;
34+
}
35+
}
36+
2737
public override void Visit(OpenApiDocument doc)
2838
{
2939
if (doc.Tags != null)
@@ -177,7 +187,14 @@ private void ResolveTags(IList<OpenApiTag> tags)
177187
{
178188
if (string.IsNullOrEmpty(reference.ExternalResource))
179189
{
180-
return _currentDocument.ResolveReference(reference) as T;
190+
try
191+
{
192+
return _currentDocument.ResolveReference(reference) as T;
193+
} catch(OpenApiException ex)
194+
{
195+
_errors.Add(new OpenApiError(ex));
196+
return null;
197+
}
181198
}
182199
else if (_resolveRemoteReferences == true)
183200
{

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

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
6+
using System.Linq;
57
using Microsoft.OpenApi.Extensions;
68
using Microsoft.OpenApi.Models;
79
using Microsoft.OpenApi.Readers.ParseNodes;
10+
using Microsoft.OpenApi.Services;
811

912
namespace Microsoft.OpenApi.Readers.V2
1013
{
@@ -66,7 +69,15 @@ internal static partial class OpenApiV2Deserializer
6669
ReferenceType.Parameter,
6770
LoadParameter);
6871

69-
//TODO: Convert reusable body parameters into Requestbody parameters
72+
o.Components.RequestBodies = n.CreateMapWithReference(ReferenceType.RequestBody, p =>
73+
{
74+
var parameter = LoadParameter(p, evenBody: true);
75+
if (parameter.In == null) {
76+
return CreateRequestBody(n.Context,parameter);
77+
}
78+
return null;
79+
}
80+
);
7081
}
7182
},
7283
{
@@ -141,7 +152,49 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
141152

142153
MakeServers(openApidoc.Servers, openApiNode.Context);
143154

155+
FixRequestBodyReferences(openApidoc);
144156
return openApidoc;
145157
}
158+
159+
private static void FixRequestBodyReferences(OpenApiDocument doc)
160+
{
161+
// Walk all unresolved parameter references
162+
// if id matches with request body Id, change type
163+
if (doc.Components?.RequestBodies != null && doc.Components?.RequestBodies.Count > 0)
164+
{
165+
var fixer = new RequestBodyReferenceFixer(doc.Components?.RequestBodies);
166+
var walker = new OpenApiWalker(fixer);
167+
walker.Walk(doc);
168+
}
169+
170+
}
171+
}
172+
173+
internal class RequestBodyReferenceFixer : OpenApiVisitorBase
174+
{
175+
private IDictionary<string, OpenApiRequestBody> _requestBodies;
176+
public RequestBodyReferenceFixer(IDictionary<string, OpenApiRequestBody> requestBodies)
177+
{
178+
_requestBodies = requestBodies;
179+
}
180+
public override void Visit(OpenApiOperation operation)
181+
{
182+
var body = operation.Parameters.Where(p => p.UnresolvedReference == true
183+
&& _requestBodies.ContainsKey(p.Reference.Id)).FirstOrDefault();
184+
185+
if (body != null)
186+
{
187+
operation.Parameters.Remove(body);
188+
operation.RequestBody = new OpenApiRequestBody()
189+
{
190+
UnresolvedReference = true,
191+
Reference = new OpenApiReference()
192+
{
193+
Id = body.Reference.Id,
194+
Type = ReferenceType.RequestBody
195+
}
196+
};
197+
}
198+
}
146199
}
147200
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ private static OpenApiRequestBody CreateFormBody(ParsingContext context, List<Op
178178
return formBody;
179179
}
180180

181-
private static OpenApiRequestBody CreateRequestBody(
181+
internal static OpenApiRequestBody CreateRequestBody(
182182
ParsingContext context,
183183
OpenApiParameter bodyParameter)
184184
{

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
199199
switch (value)
200200
{
201201
case "body":
202-
n.Context.SetTempStorage("bodyParameter", o);
202+
n.Context.SetTempStorage(TempStorageKeys.BodyParameter, o);
203203
break;
204204
case "formData":
205205
var formParameters = n.Context.GetFromTempStorage<List<OpenApiParameter>>("formParameters");
@@ -219,6 +219,11 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
219219
}
220220

221221
public static OpenApiParameter LoadParameter(ParseNode node)
222+
{
223+
return LoadParameter(node, false);
224+
}
225+
226+
public static OpenApiParameter LoadParameter(ParseNode node, bool evenBody)
222227
{
223228
// Reset the local variables every time this method is called.
224229
_in = null;
@@ -243,7 +248,7 @@ public static OpenApiParameter LoadParameter(ParseNode node)
243248
node.Context.SetTempStorage("schema", null);
244249
}
245250

246-
if (_in == null)
251+
if (_in == null && !evenBody)
247252
{
248253
return null; // Don't include Form or Body parameters in OpenApiOperation.Parameters list
249254
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ internal static partial class OpenApiV2Deserializer
109109
{
110110
"enum", (o, n) =>
111111
{
112-
o.Enum = n.CreateSimpleList<IOpenApiAny>(s => new OpenApiString(s.GetScalarValue()));
112+
o.Enum = n.CreateList<IOpenApiAny>(s => s.CreateAny());
113113
}
114114
},
115115

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,7 @@ internal static partial class OpenApiV2Deserializer
6969
{
7070
"scopes", (o, n) =>
7171
{
72-
var value = n.GetScalarValue();
73-
if (!String.IsNullOrEmpty(value))
74-
{
75-
_flow.Scopes = n.CreateSimpleMap(LoadString);
76-
}
72+
_flow.Scopes = n.CreateSimpleMap(LoadString);
7773
}
7874
}
7975
};

0 commit comments

Comments
 (0)