Skip to content

Commit 3ce6830

Browse files
author
Fabian Niederer
authored
Merge branch 'vnext' into feature/add-path-signature-unique-validation
2 parents 6c0b9fa + 2db9643 commit 3ce6830

24 files changed

+564
-352
lines changed

src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<Company>Microsoft</Company>
1111
<Title>Microsoft.OpenApi.Readers</Title>
1212
<PackageId>Microsoft.OpenApi.Readers</PackageId>
13-
<Version>1.2.1</Version>
13+
<Version>1.2.3</Version>
1414
<Description>OpenAPI.NET Readers for JSON and YAML documents</Description>
1515
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
1616
<PackageTags>OpenAPI .NET</PackageTags>

src/Microsoft.OpenApi.Readers/OpenApiTextReaderReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public OpenApiDocument Read(TextReader input, out OpenApiDiagnostic diagnostic)
4545
catch (YamlException ex)
4646
{
4747
diagnostic = new OpenApiDiagnostic();
48-
diagnostic.Errors.Add(new OpenApiError($"#char={ex.Start.Line}", ex.Message));
48+
diagnostic.Errors.Add(new OpenApiError($"#line={ex.Start.Line}", ex.Message));
4949
return new OpenApiDocument();
5050
}
5151

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public override void Visit(OpenApiComponents components)
5252
ResolveMap(components.Examples);
5353
ResolveMap(components.Schemas);
5454
ResolveMap(components.SecuritySchemes);
55+
ResolveMap(components.Headers);
5556
}
5657

5758
public override void Visit(IDictionary<string, OpenApiCallback> callbacks)
@@ -99,6 +100,15 @@ public override void Visit(OpenApiResponses responses)
99100
ResolveMap(responses);
100101
}
101102

103+
/// <summary>
104+
/// Resolve all references to headers
105+
/// </summary>
106+
/// <param name="headers"></param>
107+
public override void Visit(IDictionary<string, OpenApiHeader> headers)
108+
{
109+
ResolveMap(headers);
110+
}
111+
102112
/// <summary>
103113
/// Resolve all references to SecuritySchemes
104114
/// </summary>

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Collections.Generic;
55
using System.Linq;
6+
using Microsoft.OpenApi.Any;
67
using Microsoft.OpenApi.Extensions;
78
using Microsoft.OpenApi.Models;
89
using Microsoft.OpenApi.Readers.ParseNodes;
@@ -164,6 +165,7 @@ private static OpenApiRequestBody CreateFormBody(ParsingContext context, List<Op
164165
{
165166
var schema = v.Schema;
166167
schema.Description = v.Description;
168+
schema.Extensions = v.Extensions;
167169
return schema;
168170
}),
169171
Required = new HashSet<string>(formParameters.Where(p => p.Required).Select(p => p.Name))
@@ -201,9 +203,11 @@ internal static OpenApiRequestBody CreateRequestBody(
201203
v => new OpenApiMediaType
202204
{
203205
Schema = bodyParameter.Schema
204-
})
206+
}),
207+
Extensions = bodyParameter.Extensions
205208
};
206209

210+
requestBody.Extensions[OpenApiConstants.BodyName] = new OpenApiString(bodyParameter.Name);
207211
return requestBody;
208212
}
209213

src/Microsoft.OpenApi/Microsoft.OpenApi.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<Company>Microsoft</Company>
1111
<Title>Microsoft.OpenApi</Title>
1212
<PackageId>Microsoft.OpenApi</PackageId>
13-
<Version>1.2.1</Version>
13+
<Version>1.2.3</Version>
1414
<Description>.NET models with JSON and YAML writers for OpenAPI specification</Description>
1515
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
1616
<PackageTags>OpenAPI .NET</PackageTags>

src/Microsoft.OpenApi/Models/OpenApiConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,11 @@ public static class OpenApiConstants
560560
/// </summary>
561561
public const string DefaultDescription = "Default Description";
562562

563+
/// <summary>
564+
/// Field: BodyName extensions
565+
/// </summary>
566+
public const string BodyName = "x-bodyName";
567+
563568
/// <summary>
564569
/// Field: version3_0_0
565570
/// </summary>

src/Microsoft.OpenApi/Models/OpenApiOperation.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,30 +228,44 @@ public void SerializeAsV2(IOpenApiWriter writer)
228228
{
229229
foreach (var property in RequestBody.Content.First().Value.Schema.Properties)
230230
{
231+
var paramName = property.Key;
232+
var paramSchema = property.Value;
233+
if (paramSchema.Type == "string" && paramSchema.Format == "binary") {
234+
paramSchema.Type = "file";
235+
paramSchema.Format = null;
236+
}
231237
parameters.Add(
232238
new OpenApiFormDataParameter
233239
{
234240
Description = property.Value.Description,
235241
Name = property.Key,
236242
Schema = property.Value,
237243
Required = RequestBody.Content.First().Value.Schema.Required.Contains(property.Key)
244+
238245
});
239246
}
240247
}
241248
else
242249
{
243250
var content = RequestBody.Content.Values.FirstOrDefault();
251+
244252
var bodyParameter = new OpenApiBodyParameter
245253
{
246254
Description = RequestBody.Description,
247255
// V2 spec actually allows the body to have custom name.
248-
// Our library does not support this at the moment.
256+
// To allow round-tripping we use an extension to hold the name
249257
Name = "body",
250258
Schema = content?.Schema ?? new OpenApiSchema(),
251259
Required = RequestBody.Required,
252-
Extensions = RequestBody.Extensions
260+
Extensions = RequestBody.Extensions.ToDictionary(k => k.Key, v => v.Value) // Clone extensions so we can remove the x-bodyName extensions from the output V2 model.
253261
};
254262

263+
if (bodyParameter.Extensions.ContainsKey(OpenApiConstants.BodyName))
264+
{
265+
bodyParameter.Name = (RequestBody.Extensions[OpenApiConstants.BodyName] as OpenApiString)?.Value ?? "body";
266+
bodyParameter.Extensions.Remove(OpenApiConstants.BodyName);
267+
}
268+
255269
parameters.Add(bodyParameter);
256270
}
257271
}

src/Microsoft.OpenApi/Services/OpenApiExampleComparer.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,35 @@ public override void Compare(
4242
return;
4343
}
4444

45-
new OpenApiReferenceComparer<OpenApiExample>()
46-
.Compare(sourceExample.Reference, targetExample.Reference, comparisonContext);
45+
if (sourceExample.Reference != null
46+
&& targetExample.Reference != null
47+
&& sourceExample.Reference.Id != targetExample.Reference.Id)
48+
{
49+
WalkAndAddOpenApiDifference(
50+
comparisonContext,
51+
OpenApiConstants.DollarRef,
52+
new OpenApiDifference
53+
{
54+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
55+
SourceValue = sourceExample.Reference,
56+
TargetValue = targetExample.Reference,
57+
OpenApiComparedElementType = typeof(OpenApiReference)
58+
});
59+
60+
return;
61+
}
62+
63+
if (sourceExample.Reference != null)
64+
{
65+
sourceExample = (OpenApiExample)comparisonContext.SourceDocument.ResolveReference(
66+
sourceExample.Reference);
67+
}
68+
69+
if (targetExample.Reference != null)
70+
{
71+
targetExample = (OpenApiExample)comparisonContext.TargetDocument.ResolveReference(
72+
targetExample.Reference);
73+
}
4774

4875
WalkAndCompare(comparisonContext, OpenApiConstants.Description,
4976
() => Compare(sourceExample.Description, targetExample.Description, comparisonContext));

src/Microsoft.OpenApi/Services/OpenApiParameterComparer.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,35 @@ public override void Compare(
4343
return;
4444
}
4545

46-
new OpenApiReferenceComparer<OpenApiParameter>()
47-
.Compare(sourceParameter.Reference, targetParameter.Reference, comparisonContext);
46+
if (sourceParameter.Reference != null
47+
&& targetParameter.Reference != null
48+
&& sourceParameter.Reference.Id != targetParameter.Reference.Id)
49+
{
50+
WalkAndAddOpenApiDifference(
51+
comparisonContext,
52+
OpenApiConstants.DollarRef,
53+
new OpenApiDifference
54+
{
55+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
56+
SourceValue = sourceParameter.Reference,
57+
TargetValue = targetParameter.Reference,
58+
OpenApiComparedElementType = typeof(OpenApiReference)
59+
});
60+
61+
return;
62+
}
63+
64+
if (sourceParameter.Reference != null)
65+
{
66+
sourceParameter = (OpenApiParameter)comparisonContext.SourceDocument.ResolveReference(
67+
sourceParameter.Reference);
68+
}
69+
70+
if (targetParameter.Reference != null)
71+
{
72+
targetParameter = (OpenApiParameter)comparisonContext.TargetDocument.ResolveReference(
73+
targetParameter.Reference);
74+
}
4875

4976
WalkAndCompare(
5077
comparisonContext,

src/Microsoft.OpenApi/Services/OpenApiRequestBodyComparer.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,35 @@ public override void Compare(
4242
return;
4343
}
4444

45-
new OpenApiReferenceComparer<OpenApiRequestBody>()
46-
.Compare(sourceRequestBody.Reference, targetRequestBody.Reference, comparisonContext);
45+
if (sourceRequestBody.Reference != null
46+
&& targetRequestBody.Reference != null
47+
&& sourceRequestBody.Reference.Id != targetRequestBody.Reference.Id)
48+
{
49+
WalkAndAddOpenApiDifference(
50+
comparisonContext,
51+
OpenApiConstants.DollarRef,
52+
new OpenApiDifference
53+
{
54+
OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
55+
SourceValue = sourceRequestBody.Reference,
56+
TargetValue = targetRequestBody.Reference,
57+
OpenApiComparedElementType = typeof(OpenApiReference)
58+
});
59+
60+
return;
61+
}
62+
63+
if (sourceRequestBody.Reference != null)
64+
{
65+
sourceRequestBody = (OpenApiRequestBody)comparisonContext.SourceDocument.ResolveReference(
66+
sourceRequestBody.Reference);
67+
}
68+
69+
if (targetRequestBody.Reference != null)
70+
{
71+
targetRequestBody = (OpenApiRequestBody)comparisonContext.TargetDocument.ResolveReference(
72+
targetRequestBody.Reference);
73+
}
4774

4875
WalkAndCompare(comparisonContext, OpenApiConstants.Description,
4976
() => Compare(sourceRequestBody.Description, targetRequestBody.Description, comparisonContext));

0 commit comments

Comments
 (0)