Skip to content

Commit 6bb23b6

Browse files
authored
Adds setting to configure leaving stream open (#605)
* Add new boolean setting to flag whether or not to leave stream open * Use LeaveStreamOpen setting to check whether to dispose StreamReader * Add new test to validate new LeaveStreamOpen setting * PR review feedback changes - Remove default assignment of false boolean to setting - Code simplification Co-authored-by: Irvine Sunday <[email protected]>
1 parent 2b3abef commit 6bb23b6

File tree

3 files changed

+54
-9
lines changed

3 files changed

+54
-9
lines changed

src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
2-
// Licensed under the MIT license.
2+
// Licensed under the MIT license.
33

44
using Microsoft.OpenApi.Any;
55
using Microsoft.OpenApi.Interfaces;
@@ -61,11 +61,17 @@ public class OpenApiReaderSettings
6161
public Uri BaseUrl { get; set; }
6262

6363
/// <summary>
64-
/// Function used to provide an alternative loader for accessing external references.
64+
/// Function used to provide an alternative loader for accessing external references.
6565
/// </summary>
6666
/// <remarks>
6767
/// Default loader will attempt to dereference http(s) urls and file urls.
6868
/// </remarks>
6969
public IStreamLoader CustomExternalLoader { get; set; }
70+
71+
/// <summary>
72+
/// Whether to leave the <see cref="Stream"/> object open after reading
73+
/// from an <see cref="OpenApiStreamReader"/> object.
74+
/// </summary>
75+
public bool LeaveStreamOpen { get; set; }
7076
}
7177
}

src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
2-
// Licensed under the MIT license.
2+
// Licensed under the MIT license.
33

44
using System.IO;
55
using System.Threading.Tasks;
@@ -29,14 +29,18 @@ public OpenApiStreamReader(OpenApiReaderSettings settings = null)
2929
/// Reads the stream input and parses it into an Open API document.
3030
/// </summary>
3131
/// <param name="input">Stream containing OpenAPI description to parse.</param>
32-
/// <param name="diagnostic">Returns diagnostic object containing errors detected during parsing</param>
33-
/// <returns>Instance of newly created OpenApiDocument</returns>
32+
/// <param name="diagnostic">Returns diagnostic object containing errors detected during parsing.</param>
33+
/// <returns>Instance of newly created OpenApiDocument.</returns>
3434
public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
3535
{
36-
using (var reader = new StreamReader(input))
36+
var reader = new StreamReader(input);
37+
var result = new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic);
38+
if (!_settings.LeaveStreamOpen)
3739
{
38-
return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic);
40+
reader.Dispose();
3941
}
42+
43+
return result;
4044
}
4145

4246
/// <summary>
@@ -50,8 +54,8 @@ public async Task<ReadResult> ReadAsync(Stream input)
5054
if (input is MemoryStream)
5155
{
5256
bufferedStream = (MemoryStream)input;
53-
}
54-
else
57+
}
58+
else
5559
{
5660
// Buffer stream so that OpenApiTextReaderReader can process it synchronously
5761
// YamlDocument doesn't support async reading.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.IO;
5+
using Xunit;
6+
7+
namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests
8+
{
9+
public class OpenApiStreamReaderTests
10+
{
11+
private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/";
12+
13+
[Fact]
14+
public void StreamShouldCloseIfLeaveStreamOpenSettingEqualsFalse()
15+
{
16+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")))
17+
{
18+
var reader = new OpenApiStreamReader(new OpenApiReaderSettings { LeaveStreamOpen = false });
19+
reader.Read(stream, out _);
20+
Assert.False(stream.CanRead);
21+
}
22+
}
23+
24+
[Fact]
25+
public void StreamShouldNotCloseIfLeaveStreamOpenSettingEqualsTrue()
26+
{
27+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")))
28+
{
29+
var reader = new OpenApiStreamReader(new OpenApiReaderSettings { LeaveStreamOpen = true});
30+
reader.Read(stream, out _);
31+
Assert.True(stream.CanRead);
32+
}
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)