From d3db9446e598ddd12ddc25c0658efea9116d83e6 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 7 Jun 2021 15:02:03 +0300 Subject: [PATCH 1/4] Add new boolean setting to flag whether or not to leave stream open --- src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs index da178ae86..aac3db136 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs @@ -1,5 +1,5 @@ // Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. +// Licensed under the MIT license. using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; @@ -61,11 +61,17 @@ public class OpenApiReaderSettings public Uri BaseUrl { get; set; } /// - /// Function used to provide an alternative loader for accessing external references. + /// Function used to provide an alternative loader for accessing external references. /// /// /// Default loader will attempt to dereference http(s) urls and file urls. /// public IStreamLoader CustomExternalLoader { get; set; } + + /// + /// Whether to leave the object open after reading + /// from an object. + /// + public bool LeaveStreamOpen { get; set; } = false; } } From 895c31ed4dad951df067f81506872dd08cb6f40b Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 7 Jun 2021 15:04:09 +0300 Subject: [PATCH 2/4] Use LeaveStreamOpen setting to check whether to dispose StreamReader --- .../OpenApiStreamReader.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs index cab5d1a83..0ea2b6e92 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs @@ -1,5 +1,5 @@ // Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. +// Licensed under the MIT license. using System.IO; using System.Threading.Tasks; @@ -29,13 +29,20 @@ public OpenApiStreamReader(OpenApiReaderSettings settings = null) /// Reads the stream input and parses it into an Open API document. /// /// Stream containing OpenAPI description to parse. - /// Returns diagnostic object containing errors detected during parsing - /// Instance of newly created OpenApiDocument + /// Returns diagnostic object containing errors detected during parsing. + /// Instance of newly created OpenApiDocument. public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic) { - using (var reader = new StreamReader(input)) + if (_settings.LeaveStreamOpen) { - return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); + return new OpenApiTextReaderReader(_settings).Read(new StreamReader(input), out diagnostic); + } + else + { + using (var reader = new StreamReader(input)) + { + return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); + } } } @@ -50,8 +57,8 @@ public async Task ReadAsync(Stream input) if (input is MemoryStream) { bufferedStream = (MemoryStream)input; - } - else + } + else { // Buffer stream so that OpenApiTextReaderReader can process it synchronously // YamlDocument doesn't support async reading. From a87d7bab5b57ace2a6018cd5db7ffd8c39c04610 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 7 Jun 2021 15:04:46 +0300 Subject: [PATCH 3/4] Add new test to validate new LeaveStreamOpen setting --- .../OpenApiStreamReaderTests.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs new file mode 100644 index 000000000..7567e0b7d --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.IO; +using Xunit; + +namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests +{ + public class OpenApiStreamReaderTests + { + private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/"; + + [Fact] + public void StreamShouldCloseIfLeaveStreamOpenSettingEqualsFalse() + { + using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml"))) + { + var reader = new OpenApiStreamReader(new OpenApiReaderSettings { LeaveStreamOpen = false }); + reader.Read(stream, out _); + Assert.False(stream.CanRead); + } + } + + [Fact] + public void StreamShouldNotCloseIfLeaveStreamOpenSettingEqualsTrue() + { + using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml"))) + { + var reader = new OpenApiStreamReader(new OpenApiReaderSettings { LeaveStreamOpen = true}); + reader.Read(stream, out _); + Assert.True(stream.CanRead); + } + } + } +} From e6520232858637a97a16295bfed5af33958cd76f Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 7 Jun 2021 15:42:59 +0300 Subject: [PATCH 4/4] PR review feedback changes - Remove default assignment of false boolean to setting - Code simplification --- .../OpenApiReaderSettings.cs | 2 +- .../OpenApiStreamReader.cs | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs index aac3db136..732708459 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs @@ -72,6 +72,6 @@ public class OpenApiReaderSettings /// Whether to leave the object open after reading /// from an object. /// - public bool LeaveStreamOpen { get; set; } = false; + public bool LeaveStreamOpen { get; set; } } } diff --git a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs index 0ea2b6e92..cccf06a68 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs @@ -33,17 +33,14 @@ public OpenApiStreamReader(OpenApiReaderSettings settings = null) /// Instance of newly created OpenApiDocument. public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic) { - if (_settings.LeaveStreamOpen) + var reader = new StreamReader(input); + var result = new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); + if (!_settings.LeaveStreamOpen) { - return new OpenApiTextReaderReader(_settings).Read(new StreamReader(input), out diagnostic); - } - else - { - using (var reader = new StreamReader(input)) - { - return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic); - } + reader.Dispose(); } + + return result; } ///