Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ The base JSON and YAML processors are built into this project. Below is the list

- [**C# Comment / Annotation Processor**](https://github.com/Microsoft/OpenAPI.NET.CSharpAnnotations) : Converts standard .NET annotations ( /// comments ) emitted from your build (MSBuild.exe) into OpenAPI.NET document object.

- [**OData CSDL Processor**](https://github.com/Microsoft/OpenAPI.NET.OData) : Converts the XML representation of the Entity Data Model (EDM) describing an OData Service into OpenAPI.NET document object.

# Example Usage

Creating an OpenAPI Document
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net46; netstandard2.0</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
Expand All @@ -10,7 +10,7 @@
<Company>Microsoft</Company>
<Title>Microsoft.OpenApi.Readers</Title>
<PackageId>Microsoft.OpenApi.Readers</PackageId>
<Version>1.1.0</Version>
<Version>1.1.1</Version>
<Description>OpenAPI.NET Readers for JSON and YAML documents</Description>
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
<PackageTags>OpenAPI .NET</PackageTags>
Expand Down
22 changes: 10 additions & 12 deletions src/Microsoft.OpenApi.Readers/ParseNodes/ValueNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Licensed under the MIT license.

using System;
using System.Globalization;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Readers.Exceptions;
using SharpYaml.Serialization;

Expand Down Expand Up @@ -52,28 +52,26 @@ public override IOpenApiAny CreateAny()
return new OpenApiBoolean(false);
}

if (int.TryParse(value, out var intValue))
// The NumberStyles below are the default ones based on
// https://docs.microsoft.com/en-us/dotnet/api/?view=netframework-4.7.2
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue))
{
return new OpenApiInteger(intValue);
}

if (long.TryParse(value, out var longValue))
if (long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var longValue))
{
return
new OpenApiLong(
longValue);
return new OpenApiLong(longValue);
}

if (double.TryParse(value, out var dblValue))
if (double.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out var doubleValue))
{
return
new OpenApiDouble(
dblValue); // Note(darrmi): This may be better as decimal. Further investigation required.
return new OpenApiDouble(doubleValue);
}

if (DateTimeOffset.TryParse(value, out var datetimeValue))
if (DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateTimeValue))
{
return new OpenApiDateTime(datetimeValue);
return new OpenApiDateTime(dateTimeValue);
}

// if we can't identify the type of value, return it as string.
Expand Down
10 changes: 6 additions & 4 deletions src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
Expand Down Expand Up @@ -72,11 +73,12 @@ internal static partial class OpenApiV2Deserializer

o.Components.RequestBodies = n.CreateMapWithReference(ReferenceType.RequestBody, p =>
{
var parameter = LoadParameter(p, evenBody: true);
if (parameter.In == null)
var parameter = LoadParameter(p, loadRequestBody: true);
if (parameter != null)
{
return CreateRequestBody(n.Context,parameter);
return CreateRequestBody(n.Context, parameter);
}

return null;
}
);
Expand Down Expand Up @@ -191,7 +193,7 @@ private static string BuildUrl(string scheme, string host, string basePath)
{
var pieces = host.Split(':');
host = pieces.First();
port = int.Parse(pieces.Last());
port = int.Parse(pieces.Last(), CultureInfo.InvariantCulture);
}

var uriBuilder = new UriBuilder()
Expand Down
17 changes: 9 additions & 8 deletions src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license.

using System;
using System.Globalization;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
Expand Down Expand Up @@ -54,10 +55,10 @@ internal static partial class OpenApiV2Deserializer
GetOrCreateSchema(o).Default = n.CreateAny();
}
},
{
{
"maximum", (o, n) =>
{
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue());
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -69,7 +70,7 @@ internal static partial class OpenApiV2Deserializer
{
"minimum", (o, n) =>
{
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue());
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -81,13 +82,13 @@ internal static partial class OpenApiV2Deserializer
{
"maxLength", (o, n) =>
{
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"minLength", (o, n) =>
{
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -99,13 +100,13 @@ internal static partial class OpenApiV2Deserializer
{
"maxItems", (o, n) =>
{
GetOrCreateSchema(o).MaxItems = int.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MaxItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"minItems", (o, n) =>
{
GetOrCreateSchema(o).MinItems = int.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MinItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -117,7 +118,7 @@ internal static partial class OpenApiV2Deserializer
{
"multipleOf", (o, n) =>
{
GetOrCreateSchema(o).MultipleOf = decimal.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MultipleOf = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand Down
35 changes: 23 additions & 12 deletions src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

using System;
using System.Collections.Generic;
using Microsoft.OpenApi.Any;
using System.Globalization;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Readers.ParseNodes;
Expand All @@ -16,7 +16,7 @@ namespace Microsoft.OpenApi.Readers.V2
/// </summary>
internal static partial class OpenApiV2Deserializer
{
private static ParameterLocation? _in;
private static bool _isBodyOrFormData;

private static readonly FixedFieldMap<OpenApiParameter> _parameterFixedFields =
new FixedFieldMap<OpenApiParameter>
Expand Down Expand Up @@ -90,25 +90,25 @@ internal static partial class OpenApiV2Deserializer
{
"minimum", (o, n) =>
{
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue());
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"maximum", (o, n) =>
{
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue());
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"maxLength", (o, n) =>
{
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"minLength", (o, n) =>
{
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue());
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand Down Expand Up @@ -204,9 +204,11 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
switch (value)
{
case "body":
_isBodyOrFormData = true;
n.Context.SetTempStorage(TempStorageKeys.BodyParameter, o);
break;
case "formData":
_isBodyOrFormData = true;
var formParameters = n.Context.GetFromTempStorage<List<OpenApiParameter>>("formParameters");
if (formParameters == null)
{
Expand All @@ -216,9 +218,13 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)

formParameters.Add(o);
break;
case "query":
case "header":
case "path":
o.In = value.GetEnumFromDisplayName<ParameterLocation>();
break;
default:
_in = value.GetEnumFromDisplayName<ParameterLocation>();
o.In = _in;
o.In = null;
break;
}
}
Expand All @@ -228,10 +234,10 @@ public static OpenApiParameter LoadParameter(ParseNode node)
return LoadParameter(node, false);
}

public static OpenApiParameter LoadParameter(ParseNode node, bool evenBody)
public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBody)
{
// Reset the local variables every time this method is called.
_in = null;
_isBodyOrFormData = false;

var mapNode = node.CheckMapNode("parameter");

Expand All @@ -253,9 +259,14 @@ public static OpenApiParameter LoadParameter(ParseNode node, bool evenBody)
node.Context.SetTempStorage("schema", null);
}

if (_in == null && !evenBody)
if (_isBodyOrFormData && !loadRequestBody)
{
return null; // Don't include Form or Body parameters when normal parameters are loaded.
}

if ( loadRequestBody && !_isBodyOrFormData )
{
return null; // Don't include Form or Body parameters in OpenApiOperation.Parameters list
return null; // Don't include non-Body or non-Form parameters when request bodies are loaded.
}

return parameter;
Expand Down
19 changes: 10 additions & 9 deletions src/Microsoft.OpenApi.Readers/V2/OpenApiSchemaDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Readers.ParseNodes;
using System.Collections.Generic;
using System.Globalization;

namespace Microsoft.OpenApi.Readers.V2
{
Expand All @@ -26,13 +27,13 @@ internal static partial class OpenApiV2Deserializer
{
"multipleOf", (o, n) =>
{
o.MultipleOf = decimal.Parse(n.GetScalarValue());
o.MultipleOf = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"maximum", (o, n) =>
{
o.Maximum = decimal.Parse(n.GetScalarValue());
o.Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -44,7 +45,7 @@ internal static partial class OpenApiV2Deserializer
{
"minimum", (o, n) =>
{
o.Minimum = decimal.Parse(n.GetScalarValue());
o.Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -56,13 +57,13 @@ internal static partial class OpenApiV2Deserializer
{
"maxLength", (o, n) =>
{
o.MaxLength = int.Parse(n.GetScalarValue());
o.MaxLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"minLength", (o, n) =>
{
o.MinLength = int.Parse(n.GetScalarValue());
o.MinLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -74,13 +75,13 @@ internal static partial class OpenApiV2Deserializer
{
"maxItems", (o, n) =>
{
o.MaxItems = int.Parse(n.GetScalarValue());
o.MaxItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"minItems", (o, n) =>
{
o.MinItems = int.Parse(n.GetScalarValue());
o.MinItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand All @@ -92,13 +93,13 @@ internal static partial class OpenApiV2Deserializer
{
"maxProperties", (o, n) =>
{
o.MaxProperties = int.Parse(n.GetScalarValue());
o.MaxProperties = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
"minProperties", (o, n) =>
{
o.MinProperties = int.Parse(n.GetScalarValue());
o.MinProperties = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
}
},
{
Expand Down
16 changes: 13 additions & 3 deletions src/Microsoft.OpenApi.Readers/V3/OpenApiParameterDeserializer.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

using System.Collections.Generic;
using System;
using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
Expand All @@ -27,7 +27,18 @@ internal static partial class OpenApiV3Deserializer
{
"in", (o, n) =>
{
o.In = n.GetScalarValue().GetEnumFromDisplayName<ParameterLocation>();
var inString = n.GetScalarValue();

if ( Enum.GetValues(typeof(ParameterLocation)).Cast<ParameterLocation>()
.Select( e => e.GetDisplayName() )
.Contains(inString) )
{
o.In = n.GetScalarValue().GetEnumFromDisplayName<ParameterLocation>();
}
else
{
o.In = null;
}
}
},
{
Expand Down Expand Up @@ -115,7 +126,6 @@ public static OpenApiParameter LoadParameter(ParseNode node)
}

var parameter = new OpenApiParameter();
var required = new List<string> {"name", "in"};

ParseMap(mapNode, parameter, _parameterFixedFields, _parameterPatternFields);

Expand Down
Loading