Skip to content

NullReferenceException at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.ProcessAnyFields #1021

@immitev

Description

@immitev

Describe the bug
The OpenAPI definition at https://sandbox.bcda.cms.gov/api/v1/swagger/ looks like a valid one. But when trying to load it via OpenApiStreamReader there's a NullReferenceException at:

   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.<>c.<.cctor>b__84_50(OpenApiHeader p)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.ProcessAnyFields[T](MapNode mapNode, T domainObject, AnyFieldMap`1 anyFieldMap)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.LoadHeader(ParseNode node)
   at Microsoft.OpenApi.Readers.ParseNodes.MapNode.<>c__DisplayClass6_0`1.<CreateMap>b__0(KeyValuePair`2 n)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
   at Microsoft.OpenApi.Readers.ParseNodes.MapNode.CreateMap[T](Func`2 map)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.<>c.<.cctor>b__84_131(OpenApiResponse o, ParseNode n)
   at Microsoft.OpenApi.Readers.ParseNodes.PropertyNode.ParseField[T](T parentInstance, IDictionary`2 fixedFields, IDictionary`2 patternFields)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.LoadResponse(ParseNode node)
   at Microsoft.OpenApi.Readers.ParseNodes.MapNode.<>c__DisplayClass7_0`1.<CreateMapWithReference>b__0(KeyValuePair`2 n)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
   at Microsoft.OpenApi.Readers.ParseNodes.MapNode.CreateMapWithReference[T](ReferenceType referenceType, Func`2 map)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.<>c.<.cctor>b__84_15(OpenApiDocument o, ParseNode n)
   at Microsoft.OpenApi.Readers.ParseNodes.PropertyNode.ParseField[T](T parentInstance, IDictionary`2 fixedFields, IDictionary`2 patternFields)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.ParseMap[T](MapNode mapNode, T domainObject, FixedFieldMap`1 fixedFieldMap, PatternFieldMap`1 patternFieldMap, List`1 requiredFields)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2Deserializer.LoadOpenApi(RootNode rootNode)
   at Microsoft.OpenApi.Readers.V2.OpenApiV2VersionService.LoadDocument(RootNode rootNode)
   at Microsoft.OpenApi.Readers.ParsingContext.Parse(YamlDocument yamlDocument)
   at Microsoft.OpenApi.Readers.OpenApiYamlDocumentReader.Read(YamlDocument input, OpenApiDiagnostic& diagnostic)
   at Microsoft.OpenApi.Readers.OpenApiTextReaderReader.Read(TextReader input, OpenApiDiagnostic& diagnostic)
   at Microsoft.OpenApi.Readers.OpenApiStreamReader.Read(Stream input, OpenApiDiagnostic& diagnostic)

To Reproduce
Try to read the attached JSON definition swagger.zip (also available at https://sandbox.bcda.cms.gov/api/v1/swagger/swagger.json ) like this:

using System.Net;
using System.IO;
using Microsoft.OpenApi.Readers;
using Microsoft.OpenApi.Validations;

public static class Program
{
	public static void Main()
	{
		const string url = @"https://sandbox.bcda.cms.gov/api/v1/swagger/swagger.json";

		OpenApiStreamReader reader = new OpenApiStreamReader(new OpenApiReaderSettings
		{
			RuleSet = new ValidationRuleSet()
		});

		Stream stream = ToStream(ReadTextFileFromWeb(url));
		reader.Read(stream, out OpenApiDiagnostic _);
	}

	private static string ReadTextFileFromWeb(string uriString)
	{
		WebRequest request = WebRequest.Create(uriString);
		WebResponse result = request.GetResponse();
		using (WebResponse response = result)
		{
			Stream responseStream = response.GetResponseStream();
			using (StreamReader reader = new StreamReader(responseStream, true))
				return reader.ReadToEnd();
		}
	}

	private static Stream ToStream(string input)
	{
		var stream = new MemoryStream();
		var writer = new StreamWriter(stream);
		writer.Write(input ?? "");
		writer.Flush();
		stream.Position = 0;
		return stream;
	}
}

Metadata

Metadata

Assignees

Labels

type:bugA broken experience

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions