diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs b/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs
index 8b10bb83f..790940759 100644
--- a/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs
+++ b/src/Microsoft.OpenApi.Readers/V2/OpenApiV2Deserializer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
+// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System.Collections.Generic;
@@ -113,11 +113,11 @@ public static IOpenApiAny LoadAny(ParseNode node)
private static IOpenApiExtension LoadExtension(string name, ParseNode node)
{
- if (node.Context.ExtensionParsers.TryGetValue(name, out var parser))
+ if (node.Context.ExtensionParsers.TryGetValue(name, out var parser) && parser(
+ OpenApiAnyConverter.GetSpecificOpenApiAny(node.CreateAny()),
+ OpenApiSpecVersion.OpenApi2_0) is { } result)
{
- return parser(
- OpenApiAnyConverter.GetSpecificOpenApiAny(node.CreateAny()),
- OpenApiSpecVersion.OpenApi2_0);
+ return result;
}
else
{
diff --git a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs b/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs
index 79b5f0671..558864854 100644
--- a/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs
+++ b/src/Microsoft.OpenApi.Readers/V3/OpenApiV3Deserializer.cs
@@ -171,11 +171,11 @@ public static IOpenApiAny LoadAny(ParseNode node)
private static IOpenApiExtension LoadExtension(string name, ParseNode node)
{
- if (node.Context.ExtensionParsers.TryGetValue(name, out var parser))
+ if (node.Context.ExtensionParsers.TryGetValue(name, out var parser) && parser(
+ OpenApiAnyConverter.GetSpecificOpenApiAny(node.CreateAny()),
+ OpenApiSpecVersion.OpenApi3_0) is { } result)
{
- return parser(
- OpenApiAnyConverter.GetSpecificOpenApiAny(node.CreateAny()),
- OpenApiSpecVersion.OpenApi3_0);
+ return result;
}
else
{
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiDeprecationExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiDeprecationExtension.cs
index 25a3b56a5..683082e2c 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiDeprecationExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiDeprecationExtension.cs
@@ -78,7 +78,7 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
/// When the source element is not an object
public static OpenApiDeprecationExtension Parse(IOpenApiAny source)
{
- if (source is not OpenApiObject rawObject) throw new ArgumentOutOfRangeException(nameof(source));
+ if (source is not OpenApiObject rawObject) return null;
var extension = new OpenApiDeprecationExtension();
if (rawObject.TryGetValue(nameof(RemovalDate).ToFirstCharacterLowerCase(), out var removalDate) && removalDate is OpenApiDateTime removalDateValue)
extension.RemovalDate = removalDateValue.Value;
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs
index e7dcf88f8..946537478 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs
@@ -45,7 +45,7 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
/// When the source element is not an object
public static OpenApiEnumFlagsExtension Parse(IOpenApiAny source)
{
- if (source is not OpenApiObject rawObject) throw new ArgumentOutOfRangeException(nameof(source));
+ if (source is not OpenApiObject rawObject) return null;
var extension = new OpenApiEnumFlagsExtension();
if (rawObject.TryGetValue(nameof(IsFlags).ToFirstCharacterLowerCase(), out var flagsValue) && flagsValue is OpenApiBoolean isFlags)
{
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs
index 5c7c1ba31..272f4b313 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs
@@ -64,7 +64,7 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
/// When the source element is not an object
public static OpenApiEnumValuesDescriptionExtension Parse(IOpenApiAny source)
{
- if (source is not OpenApiObject rawObject) throw new ArgumentOutOfRangeException(nameof(source));
+ if (source is not OpenApiObject rawObject) return null;
var extension = new OpenApiEnumValuesDescriptionExtension();
if (rawObject.TryGetValue("values", out var values) && values is OpenApiArray valuesArray)
{
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs
index a73ecf005..9b81e2561 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs
@@ -73,7 +73,7 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
/// When the source element is not an object
public static OpenApiPagingExtension Parse(IOpenApiAny source)
{
- if (source is not OpenApiObject rawObject) throw new ArgumentOutOfRangeException(nameof(source));
+ if (source is not OpenApiObject rawObject) return null;
var extension = new OpenApiPagingExtension();
if (rawObject.TryGetValue(nameof(NextLinkName).ToFirstCharacterLowerCase(), out var nextLinkName) && nextLinkName is OpenApiString nextLinkNameStr)
{
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtension.cs
index fde7a54ea..0250af758 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtension.cs
@@ -1,4 +1,4 @@
-// ------------------------------------------------------------
+// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
// ------------------------------------------------------------
@@ -39,7 +39,7 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
/// The .
public static OpenApiPrimaryErrorMessageExtension Parse(IOpenApiAny source)
{
- if (source is not OpenApiBoolean rawObject) throw new ArgumentOutOfRangeException(nameof(source));
+ if (source is not OpenApiBoolean rawObject) return null;
return new()
{
IsPrimaryErrorMessage = rawObject.Value
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiReservedParameterExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiReservedParameterExtension.cs
index 77428e186..e45d9e7e9 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiReservedParameterExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiReservedParameterExtension.cs
@@ -41,7 +41,7 @@ public bool? IsReserved
///
public static OpenApiReservedParameterExtension Parse(IOpenApiAny source)
{
- if (source is not OpenApiBoolean rawBoolean) throw new ArgumentOutOfRangeException(nameof(source));
+ if (source is not OpenApiBoolean rawBoolean) return null;
return new()
{
IsReserved = rawBoolean.Value
diff --git a/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs b/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs
index ca7870bc0..0ebeea11a 100644
--- a/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs
+++ b/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs
@@ -17,6 +17,19 @@ public void Parses()
Assert.NotNull(value);
Assert.True(value.IsReserved);
}
+
+ [Fact]
+ public void DoesNotThrowExceptionIfValueIsNull()
+ {
+ var oaiValue = new OpenApiObject
+ {
+ ["foo"] = new OpenApiString("foo")
+ };
+
+ var value = OpenApiReservedParameterExtension.Parse(oaiValue);
+ Assert.Null(value);
+ }
+
[Fact]
public void Serializes()
{