@@ -201,6 +201,139 @@ private async Task FoundFile_Served(string baseUrl, string baseDir, string reque
201
201
}
202
202
}
203
203
204
+ [ Fact ]
205
+ public async Task OnPrepareResponse_Executed_Test ( )
206
+ {
207
+ var baseUrl = "" ;
208
+ var baseDir = @"." ;
209
+ var requestUrl = "/TestDocument.txt" ;
210
+
211
+ var onPrepareResponseExecuted = false ;
212
+
213
+ using var fileProvider = new PhysicalFileProvider ( Path . Combine ( AppContext . BaseDirectory , baseDir ) ) ;
214
+ using var host = await StaticFilesTestServer . Create ( app => app . UseStaticFiles ( new StaticFileOptions
215
+ {
216
+ RequestPath = new PathString ( baseUrl ) ,
217
+ FileProvider = fileProvider ,
218
+ OnPrepareResponse = context =>
219
+ {
220
+ onPrepareResponseExecuted = true ;
221
+ }
222
+ } ) ) ;
223
+ using var server = host . GetTestServer ( ) ;
224
+ var fileInfo = fileProvider . GetFileInfo ( Path . GetFileName ( requestUrl ) ) ;
225
+ var response = await server . CreateRequest ( requestUrl ) . GetAsync ( ) ;
226
+ var responseContent = await response . Content . ReadAsByteArrayAsync ( ) ;
227
+
228
+ Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
229
+ Assert . Equal ( "text/plain" , response . Content . Headers . ContentType . ToString ( ) ) ;
230
+ Assert . True ( response . Content . Headers . ContentLength == fileInfo . Length ) ;
231
+ Assert . Equal ( response . Content . Headers . ContentLength , responseContent . Length ) ;
232
+ Assert . NotNull ( response . Headers . ETag ) ;
233
+
234
+ using ( var stream = fileInfo . CreateReadStream ( ) )
235
+ {
236
+ var fileContents = new byte [ stream . Length ] ;
237
+ stream . Read ( fileContents , 0 , ( int ) stream . Length ) ;
238
+ Assert . True ( responseContent . SequenceEqual ( fileContents ) ) ;
239
+ }
240
+
241
+ Assert . True ( onPrepareResponseExecuted ) ;
242
+ }
243
+
244
+ [ Fact ]
245
+ public async Task OnPrepareResponseAsync_Executed_Test ( )
246
+ {
247
+ var baseUrl = "" ;
248
+ var baseDir = @"." ;
249
+ var requestUrl = "/TestDocument.txt" ;
250
+
251
+ var onPrepareResponseExecuted = false ;
252
+
253
+ using var fileProvider = new PhysicalFileProvider ( Path . Combine ( AppContext . BaseDirectory , baseDir ) ) ;
254
+ using var host = await StaticFilesTestServer . Create ( app => app . UseStaticFiles ( new StaticFileOptions
255
+ {
256
+ RequestPath = new PathString ( baseUrl ) ,
257
+ FileProvider = fileProvider ,
258
+ OnPrepareResponseAsync = context =>
259
+ {
260
+ onPrepareResponseExecuted = true ;
261
+
262
+ return Task . CompletedTask ;
263
+ }
264
+ } ) ) ;
265
+ using var server = host . GetTestServer ( ) ;
266
+ var fileInfo = fileProvider . GetFileInfo ( Path . GetFileName ( requestUrl ) ) ;
267
+ var response = await server . CreateRequest ( requestUrl ) . GetAsync ( ) ;
268
+ var responseContent = await response . Content . ReadAsByteArrayAsync ( ) ;
269
+
270
+ Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
271
+ Assert . Equal ( "text/plain" , response . Content . Headers . ContentType . ToString ( ) ) ;
272
+ Assert . True ( response . Content . Headers . ContentLength == fileInfo . Length ) ;
273
+ Assert . Equal ( response . Content . Headers . ContentLength , responseContent . Length ) ;
274
+ Assert . NotNull ( response . Headers . ETag ) ;
275
+
276
+ using ( var stream = fileInfo . CreateReadStream ( ) )
277
+ {
278
+ var fileContents = new byte [ stream . Length ] ;
279
+ stream . Read ( fileContents , 0 , ( int ) stream . Length ) ;
280
+ Assert . True ( responseContent . SequenceEqual ( fileContents ) ) ;
281
+ }
282
+
283
+ Assert . True ( onPrepareResponseExecuted ) ;
284
+ }
285
+
286
+ [ Fact ]
287
+ public async Task OnPrepareResponse_Execution_Order_Test ( )
288
+ {
289
+ var baseUrl = "" ;
290
+ var baseDir = @"." ;
291
+ var requestUrl = "/TestDocument.txt" ;
292
+
293
+ var syncCallbackInvoked = false ;
294
+ var asyncCallbackInvoked = false ;
295
+
296
+ using var fileProvider = new PhysicalFileProvider ( Path . Combine ( AppContext . BaseDirectory , baseDir ) ) ;
297
+ using var host = await StaticFilesTestServer . Create ( app => app . UseStaticFiles ( new StaticFileOptions
298
+ {
299
+ RequestPath = new PathString ( baseUrl ) ,
300
+ FileProvider = fileProvider ,
301
+ OnPrepareResponse = context =>
302
+ {
303
+ Assert . False ( syncCallbackInvoked ) ;
304
+ Assert . False ( asyncCallbackInvoked ) ;
305
+ syncCallbackInvoked = true ;
306
+ } ,
307
+ OnPrepareResponseAsync = context =>
308
+ {
309
+ Assert . True ( syncCallbackInvoked ) ;
310
+ Assert . False ( asyncCallbackInvoked ) ;
311
+ asyncCallbackInvoked = true ;
312
+ return Task . CompletedTask ;
313
+ }
314
+ } ) ) ;
315
+ using var server = host . GetTestServer ( ) ;
316
+ var fileInfo = fileProvider . GetFileInfo ( Path . GetFileName ( requestUrl ) ) ;
317
+ var response = await server . CreateRequest ( requestUrl ) . GetAsync ( ) ;
318
+ var responseContent = await response . Content . ReadAsByteArrayAsync ( ) ;
319
+
320
+ Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
321
+ Assert . Equal ( "text/plain" , response . Content . Headers . ContentType . ToString ( ) ) ;
322
+ Assert . True ( response . Content . Headers . ContentLength == fileInfo . Length ) ;
323
+ Assert . Equal ( response . Content . Headers . ContentLength , responseContent . Length ) ;
324
+ Assert . NotNull ( response . Headers . ETag ) ;
325
+
326
+ using ( var stream = fileInfo . CreateReadStream ( ) )
327
+ {
328
+ var fileContents = new byte [ stream . Length ] ;
329
+ stream . Read ( fileContents , 0 , ( int ) stream . Length ) ;
330
+ Assert . True ( responseContent . SequenceEqual ( fileContents ) ) ;
331
+ }
332
+
333
+ Assert . True ( syncCallbackInvoked ) ;
334
+ Assert . True ( asyncCallbackInvoked ) ;
335
+ }
336
+
204
337
[ Fact ]
205
338
public async Task File_Served_If_Endpoint_With_Null_RequestDelegate_Is_Active ( )
206
339
{
0 commit comments