Skip to content

Commit a5ffab1

Browse files
committed
fix: adds a cancellation token argument to external document loading
1 parent 6bb1e54 commit a5ffab1

File tree

5 files changed

+19
-15
lines changed

5 files changed

+19
-15
lines changed

src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.IO;
6+
using System.Threading;
67
using System.Threading.Tasks;
78
using Microsoft.OpenApi.Models;
89

@@ -17,7 +18,8 @@ public interface IStreamLoader
1718
/// Use Uri to locate data and convert into an input object.
1819
/// </summary>
1920
/// <param name="uri">Identifier of some source of an OpenAPI Description</param>
21+
/// <param name="cancellationToken">The cancellation token.</param>
2022
/// <returns>A data object that can be processed by a reader to generate an <see cref="OpenApiDocument"/></returns>
21-
Task<Stream> LoadAsync(Uri uri);
23+
Task<Stream> LoadAsync(Uri uri, CancellationToken cancellationToken = default);
2224
}
2325
}

src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.IO;
66
using System.Net.Http;
7+
using System.Threading;
78
using System.Threading.Tasks;
89
using Microsoft.OpenApi.Interfaces;
910
using Microsoft.OpenApi.Models;
@@ -27,13 +28,8 @@ public DefaultStreamLoader(Uri baseUrl)
2728
this.baseUrl = baseUrl;
2829
}
2930

30-
/// <summary>
31-
/// Use Uri to locate data and convert into an input object.
32-
/// </summary>
33-
/// <param name="uri">Identifier of some source of an OpenAPI Description</param>
34-
/// <returns>A data object that can be processed by a reader to generate an <see cref="OpenApiDocument"/></returns>
35-
/// <exception cref="ArgumentException"></exception>
36-
public async Task<Stream> LoadAsync(Uri uri)
31+
/// <inheritdoc/>
32+
public async Task<Stream> LoadAsync(Uri uri, CancellationToken cancellationToken = default)
3733
{
3834
Uri absoluteUri;
3935
absoluteUri = baseUrl.AbsoluteUri.Equals(OpenApiConstants.BaseRegistryUri) ? new Uri(Directory.GetCurrentDirectory() + uri)
@@ -45,7 +41,11 @@ public async Task<Stream> LoadAsync(Uri uri)
4541
return File.OpenRead(absoluteUri.AbsolutePath);
4642
case "http":
4743
case "https":
48-
return await _httpClient.GetStreamAsync(absoluteUri);
44+
#if NET5_0_OR_GREATER
45+
return await _httpClient.GetStreamAsync(absoluteUri, cancellationToken).ConfigureAwait(false);
46+
#else
47+
return await _httpClient.GetStreamAsync(absoluteUri).ConfigureAwait(false);
48+
#endif
4949
default:
5050
throw new ArgumentException("Unsupported scheme");
5151
}

src/Microsoft.OpenApi/Reader/Services/OpenApiWorkspaceLoader.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,16 @@ internal async Task<OpenApiDiagnostic> LoadAsync(OpenApiReference reference,
4545
// If not already in workspace, load it and process references
4646
if (!_workspace.Contains(item.ExternalResource))
4747
{
48-
var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute));
49-
var result = await OpenApiDocument.LoadAsync(input, format, _readerSettings, cancellationToken);
48+
var input = await _loader.LoadAsync(new(item.ExternalResource, UriKind.RelativeOrAbsolute), cancellationToken).ConfigureAwait(false);
49+
var result = await OpenApiDocument.LoadAsync(input, format, _readerSettings, cancellationToken).ConfigureAwait(false);
5050
// Merge diagnostics
5151
if (result.Diagnostic != null)
5252
{
5353
diagnostic.AppendDiagnostic(result.Diagnostic, item.ExternalResource);
5454
}
5555
if (result.Document != null)
5656
{
57-
var loadDiagnostic = await LoadAsync(item, result.Document, format, diagnostic, cancellationToken);
57+
var loadDiagnostic = await LoadAsync(item, result.Document, format, diagnostic, cancellationToken).ConfigureAwait(false);
5858
diagnostic = loadDiagnostic;
5959
}
6060
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System.Threading;
45
using System.Threading.Tasks;
56
using System;
67
using Microsoft.OpenApi.Models;
@@ -64,7 +65,7 @@ public Stream Load(Uri uri)
6465
return null;
6566
}
6667

67-
public Task<Stream> LoadAsync(Uri uri)
68+
public Task<Stream> LoadAsync(Uri uri, CancellationToken cancellationToken = default)
6869
{
6970
var path = new Uri(new("http://example.org/OpenApiReaderTests/Samples/OpenApiDiagnosticReportMerged/"), uri).AbsolutePath;
7071
path = path[1..]; // remove leading slash

test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using Microsoft.OpenApi.Interfaces;
56
using Microsoft.OpenApi.Models;
@@ -80,7 +81,7 @@ public Stream Load(Uri uri)
8081
return null;
8182
}
8283

83-
public Task<Stream> LoadAsync(Uri uri)
84+
public Task<Stream> LoadAsync(Uri uri, CancellationToken cancellationToken = default)
8485
{
8586
return Task.FromResult<Stream>(null);
8687
}
@@ -93,7 +94,7 @@ public Stream Load(Uri uri)
9394
return null;
9495
}
9596

96-
public Task<Stream> LoadAsync(Uri uri)
97+
public Task<Stream> LoadAsync(Uri uri, CancellationToken cancellationToken = default)
9798
{
9899
var path = new Uri(new("http://example.org/V3Tests/Samples/OpenApiWorkspace/"), uri).AbsolutePath;
99100
path = path[1..]; // remove leading slash

0 commit comments

Comments
 (0)