Skip to content

Commit b651e63

Browse files
Merge pull request #1744 from microsoft/mk/fix-stream-reader-bug
Fix Initialization of StreamReader in OpenApiStreamReader throws an ArgumentNullException
2 parents 4e4ba5d + 29acad7 commit b651e63

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/Microsoft.OpenApi.Readers/OpenApiStreamReader.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.IO;
6+
using System.Text;
67
using System.Threading;
78
using System.Threading.Tasks;
89
using Microsoft.OpenApi.Interfaces;
@@ -41,7 +42,7 @@ public OpenApiStreamReader(OpenApiReaderSettings settings = null)
4142
/// <returns>Instance of newly created OpenApiDocument.</returns>
4243
public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
4344
{
44-
using var reader = new StreamReader(input, default, true, -1, _settings.LeaveStreamOpen);
45+
using var reader = new StreamReader(input, Encoding.UTF8, true, 4096, _settings.LeaveStreamOpen);
4546
return new OpenApiTextReaderReader(_settings).Read(reader, out diagnostic);
4647
}
4748

@@ -54,6 +55,7 @@ public OpenApiDocument Read(Stream input, out OpenApiDiagnostic diagnostic)
5455
public async Task<ReadResult> ReadAsync(Stream input, CancellationToken cancellationToken = default)
5556
{
5657
MemoryStream bufferedStream;
58+
int bufferSize = 4096;
5759
if (input is MemoryStream stream)
5860
{
5961
bufferedStream = stream;
@@ -63,11 +65,12 @@ public async Task<ReadResult> ReadAsync(Stream input, CancellationToken cancella
6365
// Buffer stream so that OpenApiTextReaderReader can process it synchronously
6466
// YamlDocument doesn't support async reading.
6567
bufferedStream = new();
66-
await input.CopyToAsync(bufferedStream, 81920, cancellationToken);
68+
bufferSize = 81920;
69+
await input.CopyToAsync(bufferedStream, bufferSize, cancellationToken);
6770
bufferedStream.Position = 0;
6871
}
6972

70-
using var reader = new StreamReader(bufferedStream, default, true, -1, _settings.LeaveStreamOpen);
73+
using var reader = new StreamReader(bufferedStream, Encoding.UTF8, true, bufferSize, _settings.LeaveStreamOpen);
7174
return await new OpenApiTextReaderReader(_settings).ReadAsync(reader, cancellationToken);
7275
}
7376

@@ -80,7 +83,7 @@ public async Task<ReadResult> ReadAsync(Stream input, CancellationToken cancella
8083
/// <returns>Instance of newly created OpenApiDocument</returns>
8184
public T ReadFragment<T>(Stream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic) where T : IOpenApiReferenceable
8285
{
83-
using var reader = new StreamReader(input, default, true, -1, _settings.LeaveStreamOpen);
86+
using var reader = new StreamReader(input, Encoding.UTF8, true, 4096, _settings.LeaveStreamOpen);
8487
return new OpenApiTextReaderReader(_settings).ReadFragment<T>(reader, version, out diagnostic);
8588
}
8689
}

test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs

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

4+
using System;
45
using System.IO;
6+
using System.Net.Http;
57
using System.Threading.Tasks;
68
using Xunit;
79

@@ -44,5 +46,20 @@ public async Task StreamShouldNotBeDisposedIfLeaveStreamOpenSettingIsTrue()
4446
stream.Seek(0, SeekOrigin.Begin); // does not throw an object disposed exception
4547
Assert.True(stream.CanRead);
4648
}
49+
50+
[Fact]
51+
public async Task StreamShouldReadWhenInitialized()
52+
{
53+
var httpClient = new HttpClient
54+
{
55+
BaseAddress = new Uri("https://raw.githubusercontent.com/OAI/OpenAPI-Specification/")
56+
};
57+
58+
var stream = await httpClient.GetStreamAsync("master/examples/v3.0/petstore.yaml");
59+
60+
// Read V3 as YAML
61+
var openApiDocument = new OpenApiStreamReader().Read(stream, out var diagnostic);
62+
Assert.NotNull(openApiDocument);
63+
}
4764
}
4865
}

0 commit comments

Comments
 (0)