diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index d6b57fbbb..2abd04873 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -360,7 +360,9 @@ SecurityException or private static string InspectInputFormat(string input) { - return input.StartsWith("{", StringComparison.OrdinalIgnoreCase) || input.StartsWith("[", StringComparison.OrdinalIgnoreCase) ? OpenApiConstants.Json : OpenApiConstants.Yaml; + var trimmedInput = input.TrimStart(); + return trimmedInput.StartsWith("{", StringComparison.OrdinalIgnoreCase) || trimmedInput.StartsWith("[", StringComparison.OrdinalIgnoreCase) ? + OpenApiConstants.Json : OpenApiConstants.Yaml; } /// @@ -393,7 +395,7 @@ private static bool TryInspectStreamFormat(Stream stream, out string? format) var firstByte = (char)stream.ReadByte(); // Skip whitespace if present and read the next non-whitespace byte - if (char.IsWhiteSpace(firstByte)) + while (char.IsWhiteSpace(firstByte)) { firstByte = (char)stream.ReadByte(); } diff --git a/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs b/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs index 464e8fdf3..c51d3e9db 100644 --- a/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs +++ b/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs @@ -203,6 +203,32 @@ public async Task CanLoadAnAsyncOnlyStreamInYamlAndDetectFormat() Assert.Equal("Sample API", document.Info.Title); } + [Fact] + public async Task CanLoadANonSeekableStreamInJsonAndDetectFormatWhenPrecededBySpaces() + { + // Given + using var memoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(" " + documentJson)); + using var nonSeekableStream = new NonSeekableStream(memoryStream); + + // When + var (document, _) = await OpenApiDocument.LoadAsync(nonSeekableStream); + + // Then + Assert.NotNull(document); + Assert.Equal("Sample API", document.Info.Title); + } + + [Fact] + public void CanLoadAStringJsonAndDetectFormatWhenPrecededBySpaces() + { + // When + var (document, _) = OpenApiDocument.Parse(" " + documentJson); + + // Then + Assert.NotNull(document); + Assert.Equal("Sample API", document.Info.Title); + } + public sealed class AsyncOnlyStream : Stream { private readonly Stream _innerStream;