diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj index a018892d6..d73767375 100644 --- a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj +++ b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj @@ -3,7 +3,7 @@ netstandard2.0 latest true - 1.6.13 + 1.6.14 OpenAPI.NET Readers for JSON and YAML documents true diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs index e96aa4b12..c9431de98 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs @@ -41,14 +41,8 @@ public OpenApiStreamReader(OpenApiReaderSettings settings = null) /// Instance of newly created OpenApiDocument. public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic) { - var reader = new StreamReader(input); - var result = new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); - if (!_settings.LeaveStreamOpen) - { - reader.Dispose(); - } - - return result; + using var reader = new StreamReader(input, default, true, -1, _settings.LeaveStreamOpen); + return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); } /// @@ -73,7 +67,7 @@ public async Task ReadAsync(Stream input, CancellationToken cancella bufferedStream.Position = 0; } - using var reader = new StreamReader(bufferedStream); + using var reader = new StreamReader(bufferedStream, default, true, -1, _settings.LeaveStreamOpen); return await new OpenApiTextReaderReader(_settings).ReadAsync(reader, cancellationToken); } @@ -86,7 +80,7 @@ public async Task ReadAsync(Stream input, CancellationToken cancella /// Instance of newly created OpenApiDocument public T ReadFragment(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiReferenceable { - using var reader = new StreamReader(input); + using var reader = new StreamReader(input, default, true, -1, _settings.LeaveStreamOpen); return new OpenApiTextReaderReader(_settings).ReadFragment(reader, version, out diagnostic); } } diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj index 8f17fae72..45b707c96 100644 --- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj +++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj @@ -3,7 +3,7 @@ netstandard2.0 Latest true - 1.6.13 + 1.6.14 .NET models with JSON and YAML writers for OpenAPI specification true diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs index 91e271549..d3b19eff1 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -27,5 +27,21 @@ public void StreamShouldNotCloseIfLeaveStreamOpenSettingEqualsTrue() reader.Read(stream, out _); Assert.True(stream.CanRead); } + + [Fact] + public async void StreamShouldNotBeDisposedIfLeaveStreamOpenSettingIsTrue() + { + var memoryStream = new MemoryStream(); + using var fileStream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); + + await fileStream.CopyToAsync(memoryStream); + memoryStream.Position = 0; + var stream = memoryStream; + + var reader = new OpenApiStreamReader(new() { LeaveStreamOpen = true }); + _ = await reader.ReadAsync(stream); + stream.Seek(0, SeekOrigin.Begin); // does not throw an object disposed exception + Assert.True(stream.CanRead); + } } }