@@ -39,6 +39,7 @@ public static ReadResult Load(MemoryStream stream,
39
39
string format = null ,
40
40
OpenApiReaderSettings settings = null )
41
41
{
42
+ if ( stream is null ) throw new ArgumentNullException ( nameof ( stream ) ) ;
42
43
settings ??= new OpenApiReaderSettings ( ) ;
43
44
44
45
// Get the format of the stream if not provided
@@ -69,6 +70,7 @@ public static T Load<T>(Stream input,
69
70
string format = null ,
70
71
OpenApiReaderSettings settings = null ) where T : IOpenApiElement
71
72
{
73
+ if ( input is null ) throw new ArgumentNullException ( nameof ( input ) ) ;
72
74
if ( input is MemoryStream memoryStream )
73
75
{
74
76
return Load < T > ( memoryStream , version , format , out diagnostic , settings ) ;
@@ -104,11 +106,12 @@ public static T Load<T>(MemoryStream input, OpenApiSpecVersion version, string f
104
106
/// </summary>
105
107
/// <param name="url">The path to the OpenAPI file</param>
106
108
/// <param name="settings"> The OpenApi reader settings.</param>
109
+ /// <param name="token"></param>
107
110
/// <returns></returns>
108
- public static async Task < ReadResult > LoadAsync ( string url , OpenApiReaderSettings settings = null )
111
+ public static async Task < ReadResult > LoadAsync ( string url , OpenApiReaderSettings settings = null , CancellationToken token = default )
109
112
{
110
- var result = await RetrieveStreamAndFormatAsync ( url ) ;
111
- return await LoadAsync ( result . Item1 , result . Item2 , settings ) . ConfigureAwait ( false ) ;
113
+ var result = await RetrieveStreamAndFormatAsync ( url , token ) . ConfigureAwait ( false ) ;
114
+ return await LoadAsync ( result . Item1 , result . Item2 , settings , token ) . ConfigureAwait ( false ) ;
112
115
}
113
116
114
117
/// <summary>
@@ -118,11 +121,12 @@ public static async Task<ReadResult> LoadAsync(string url, OpenApiReaderSettings
118
121
/// <param name="url">The path to the OpenAPI file</param>
119
122
/// <param name="version">Version of the OpenAPI specification that the fragment conforms to.</param>
120
123
/// <param name="settings">The OpenApiReader settings.</param>
124
+ /// <param name="token"></param>
121
125
/// <returns>Instance of newly created IOpenApiElement.</returns>
122
126
/// <returns>The OpenAPI element.</returns>
123
- public static async Task < T > LoadAsync < T > ( string url , OpenApiSpecVersion version , OpenApiReaderSettings settings = null ) where T : IOpenApiElement
127
+ public static async Task < T > LoadAsync < T > ( string url , OpenApiSpecVersion version , OpenApiReaderSettings settings = null , CancellationToken token = default ) where T : IOpenApiElement
124
128
{
125
- var result = await RetrieveStreamAndFormatAsync ( url ) ;
129
+ var result = await RetrieveStreamAndFormatAsync ( url , token ) . ConfigureAwait ( false ) ;
126
130
return Load < T > ( result . Item1 , version , out var _ , result . Item2 , settings ) ;
127
131
}
128
132
@@ -136,11 +140,13 @@ public static async Task<T> LoadAsync<T>(string url, OpenApiSpecVersion version,
136
140
/// <returns></returns>
137
141
public static async Task < ReadResult > LoadAsync ( Stream input , string format = null , OpenApiReaderSettings settings = null , CancellationToken cancellationToken = default )
138
142
{
143
+ if ( input is null ) throw new ArgumentNullException ( nameof ( input ) ) ;
139
144
settings ??= new OpenApiReaderSettings ( ) ;
145
+
140
146
Stream preparedStream ;
141
147
if ( format is null )
142
148
{
143
- var readResult = await PrepareStreamForReadingAsync ( input , format , cancellationToken ) ;
149
+ var readResult = await PrepareStreamForReadingAsync ( input , format , cancellationToken ) . ConfigureAwait ( false ) ;
144
150
preparedStream = readResult . Item1 ;
145
151
format = readResult . Item2 ;
146
152
}
@@ -150,7 +156,7 @@ public static async Task<ReadResult> LoadAsync(Stream input, string format = nul
150
156
}
151
157
152
158
// Use StreamReader to process the prepared stream (buffered for YAML, direct for JSON)
153
- var result = await InternalLoadAsync ( preparedStream , format , settings , cancellationToken ) ;
159
+ var result = await InternalLoadAsync ( preparedStream , format , settings , cancellationToken ) . ConfigureAwait ( false ) ;
154
160
if ( ! settings . LeaveStreamOpen )
155
161
{
156
162
input . Dispose ( ) ;
@@ -170,6 +176,7 @@ public static ReadResult Parse(string input,
170
176
string format = null ,
171
177
OpenApiReaderSettings settings = null )
172
178
{
179
+ if ( input is null ) throw new ArgumentNullException ( nameof ( input ) ) ;
173
180
format ??= InspectInputFormat ( input ) ;
174
181
settings ??= new OpenApiReaderSettings ( ) ;
175
182
@@ -194,6 +201,7 @@ public static T Parse<T>(string input,
194
201
string format = null ,
195
202
OpenApiReaderSettings settings = null ) where T : IOpenApiElement
196
203
{
204
+ if ( input is null ) throw new ArgumentNullException ( nameof ( input ) ) ;
197
205
format ??= InspectInputFormat ( input ) ;
198
206
settings ??= new OpenApiReaderSettings ( ) ;
199
207
var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( input ) ) ;
@@ -209,7 +217,7 @@ private static async Task<ReadResult> InternalLoadAsync(Stream input, string for
209
217
210
218
if ( settings ? . LoadExternalRefs ?? DefaultReaderSettings . LoadExternalRefs )
211
219
{
212
- var diagnosticExternalRefs = await LoadExternalRefsAsync ( readResult . Document , cancellationToken , settings , format ) ;
220
+ var diagnosticExternalRefs = await LoadExternalRefsAsync ( readResult . Document , settings , format , cancellationToken ) . ConfigureAwait ( false ) ;
213
221
// Merge diagnostics of external reference
214
222
if ( diagnosticExternalRefs != null )
215
223
{
@@ -221,7 +229,7 @@ private static async Task<ReadResult> InternalLoadAsync(Stream input, string for
221
229
return readResult ;
222
230
}
223
231
224
- private static async Task < OpenApiDiagnostic > LoadExternalRefsAsync ( OpenApiDocument document , CancellationToken cancellationToken , OpenApiReaderSettings settings , string format = null )
232
+ private static async Task < OpenApiDiagnostic > LoadExternalRefsAsync ( OpenApiDocument document , OpenApiReaderSettings settings , string format = null , CancellationToken token = default )
225
233
{
226
234
// Create workspace for all documents to live in.
227
235
var baseUrl = settings . BaseUrl ?? new Uri ( OpenApiConstants . BaseRegistryUri ) ;
@@ -230,7 +238,7 @@ private static async Task<OpenApiDiagnostic> LoadExternalRefsAsync(OpenApiDocume
230
238
// Load this root document into the workspace
231
239
var streamLoader = new DefaultStreamLoader ( settings . BaseUrl ) ;
232
240
var workspaceLoader = new OpenApiWorkspaceLoader ( openApiWorkSpace , settings . CustomExternalLoader ?? streamLoader , settings ) ;
233
- return await workspaceLoader . LoadAsync ( new OpenApiReference ( ) { ExternalResource = "/" } , document , format ?? OpenApiConstants . Json , null , cancellationToken ) . ConfigureAwait ( false ) ;
241
+ return await workspaceLoader . LoadAsync ( new OpenApiReference ( ) { ExternalResource = "/" } , document , format ?? OpenApiConstants . Json , null , token ) . ConfigureAwait ( false ) ;
234
242
}
235
243
236
244
private static ReadResult InternalLoad ( MemoryStream input , string format , OpenApiReaderSettings settings )
@@ -246,7 +254,7 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp
246
254
return readResult ;
247
255
}
248
256
249
- private static async Task < ( Stream , string ) > RetrieveStreamAndFormatAsync ( string url )
257
+ private static async Task < ( Stream , string ) > RetrieveStreamAndFormatAsync ( string url , CancellationToken token = default )
250
258
{
251
259
if ( ! string . IsNullOrEmpty ( url ) )
252
260
{
@@ -256,11 +264,15 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp
256
264
if ( url . StartsWith ( "http" , StringComparison . OrdinalIgnoreCase )
257
265
|| url . StartsWith ( "https" , StringComparison . OrdinalIgnoreCase ) )
258
266
{
259
- var response = await _httpClient . GetAsync ( url ) ;
267
+ var response = await _httpClient . GetAsync ( url , token ) . ConfigureAwait ( false ) ;
260
268
var mediaType = response . Content . Headers . ContentType . MediaType ;
261
269
var contentType = mediaType . Split ( ";" . ToCharArray ( ) , StringSplitOptions . RemoveEmptyEntries ) [ 0 ] ;
262
270
format = contentType . Split ( '/' ) . LastOrDefault ( ) ;
271
+ #if NETSTANDARD2_0
263
272
stream = await response . Content . ReadAsStreamAsync ( ) ;
273
+ #else
274
+ stream = await response . Content . ReadAsStreamAsync ( token ) . ConfigureAwait ( false ) ; ;
275
+ #endif
264
276
return ( stream , format ) ;
265
277
}
266
278
else
0 commit comments