diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs index 353435bc8..eba4fd248 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs @@ -11,6 +11,7 @@ using SharpYaml.Serialization; using Microsoft.OpenApi.Models; using System; +using System.Linq; using System.Text; namespace Microsoft.OpenApi.Readers @@ -123,8 +124,12 @@ static JsonNode LoadJsonNodesFromYamlDocument(TextReader input) { var yamlStream = new YamlStream(); yamlStream.Load(input); - var yamlDocument = yamlStream.Documents[0]; - return yamlDocument.ToJsonNode(); + if (yamlStream.Documents.Any()) + { + return yamlStream.Documents[0].ToJsonNode(); + } + + throw new InvalidOperationException("No documents found in the YAML stream."); } } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 9424f053f..c86c014da 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -278,10 +278,13 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp { throw new InvalidOperationException("Loading external references are not supported when using synchronous methods."); } + if (input.Length == 0 || input.Position == input.Length) + { + throw new ArgumentException($"Cannot parse the stream: {nameof(input)} is empty or contains no elements."); + } var reader = OpenApiReaderRegistry.GetReader(format); var readResult = reader.Read(input, settings); - return readResult; } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index 9c391ceb2..6f955e62f 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -11,8 +11,8 @@ using Microsoft.OpenApi.Writers; using Xunit; using VerifyXunit; -using VerifyTests; using Microsoft.OpenApi.Models.Interfaces; +using System; namespace Microsoft.OpenApi.Readers.Tests.V31Tests { @@ -539,5 +539,11 @@ public async Task ParseDocumentWith31PropertiesWorks() // Assert await Verifier.Verify(actual); } + + [Fact] + public void ParseEmptyMemoryStreamThrowsAnArgumentException() + { + Assert.Throws(() => OpenApiDocument.Load(new MemoryStream())); + } } }