@@ -2360,7 +2360,65 @@ public async Task CanExecuteRequestDelegateWithResultsExtension()
2360
2360
Assert . False ( httpContext . RequestAborted . IsCancellationRequested ) ;
2361
2361
var decodedResponseBody = Encoding . UTF8 . GetString ( responseBodyStream . ToArray ( ) ) ;
2362
2362
Assert . Equal ( @"""Hello Tester. This is from an extension method.""" , decodedResponseBody ) ;
2363
+ }
2364
+
2365
+ [ Fact ]
2366
+ public async Task RequestDelegateRejectsNonJsonContent ( )
2367
+ {
2368
+ var httpContext = new DefaultHttpContext ( ) ;
2369
+ httpContext . Request . Headers [ "Content-Type" ] = "application/xml" ;
2370
+ httpContext . Request . Headers [ "Content-Length" ] = "1" ;
2371
+ httpContext . Features . Set < IHttpRequestBodyDetectionFeature > ( new RequestBodyDetectionFeature ( true ) ) ;
2372
+
2373
+ var serviceCollection = new ServiceCollection ( ) ;
2374
+ serviceCollection . AddSingleton ( LoggerFactory ) ;
2375
+ httpContext . RequestServices = serviceCollection . BuildServiceProvider ( ) ;
2376
+
2377
+ var factoryResult = RequestDelegateFactory . Create ( ( HttpContext context , Todo todo ) =>
2378
+ {
2379
+ } ) ;
2380
+ var requestDelegate = factoryResult . RequestDelegate ;
2381
+
2382
+ await requestDelegate ( httpContext ) ;
2383
+
2384
+ Assert . Equal ( 415 , httpContext . Response . StatusCode ) ;
2385
+ var logMessage = Assert . Single ( TestSink . Writes ) ;
2386
+ Assert . Equal ( new EventId ( 6 , "UnexpectedContentType" ) , logMessage . EventId ) ;
2387
+ Assert . Equal ( LogLevel . Debug , logMessage . LogLevel ) ;
2388
+ }
2389
+
2390
+ [ Fact ]
2391
+ public async Task RequestDelegateWithBindAndImplicitBodyRejectsNonJsonContent ( )
2392
+ {
2393
+ Todo originalTodo = new ( )
2394
+ {
2395
+ Name = "Write more tests!"
2396
+ } ;
2397
+
2398
+ var httpContext = new DefaultHttpContext ( ) ;
2399
+
2400
+ var requestBodyBytes = JsonSerializer . SerializeToUtf8Bytes ( originalTodo ) ;
2401
+ var stream = new MemoryStream ( requestBodyBytes ) ;
2402
+ httpContext . Request . Body = stream ;
2403
+ httpContext . Request . Headers [ "Content-Type" ] = "application/xml" ;
2404
+ httpContext . Request . Headers [ "Content-Length" ] = stream . Length . ToString ( CultureInfo . InvariantCulture ) ;
2405
+ httpContext . Features . Set < IHttpRequestBodyDetectionFeature > ( new RequestBodyDetectionFeature ( true ) ) ;
2406
+
2407
+ var serviceCollection = new ServiceCollection ( ) ;
2408
+ serviceCollection . AddSingleton ( LoggerFactory ) ;
2409
+ httpContext . RequestServices = serviceCollection . BuildServiceProvider ( ) ;
2410
+
2411
+ var factoryResult = RequestDelegateFactory . Create ( ( HttpContext context , JsonTodo customTodo , Todo todo ) =>
2412
+ {
2413
+ } ) ;
2414
+ var requestDelegate = factoryResult . RequestDelegate ;
2415
+
2416
+ await requestDelegate ( httpContext ) ;
2363
2417
2418
+ Assert . Equal ( 415 , httpContext . Response . StatusCode ) ;
2419
+ var logMessage = Assert . Single ( TestSink . Writes ) ;
2420
+ Assert . Equal ( new EventId ( 6 , "UnexpectedContentType" ) , logMessage . EventId ) ;
2421
+ Assert . Equal ( LogLevel . Debug , logMessage . LogLevel ) ;
2364
2422
}
2365
2423
2366
2424
private DefaultHttpContext CreateHttpContext ( )
@@ -2399,6 +2457,17 @@ private class CustomTodo : Todo
2399
2457
}
2400
2458
}
2401
2459
2460
+ private class JsonTodo : Todo
2461
+ {
2462
+ public static async ValueTask < JsonTodo ? > BindAsync ( HttpContext context , ParameterInfo parameter )
2463
+ {
2464
+ // manually call deserialize so we don't check content type
2465
+ var body = await JsonSerializer . DeserializeAsync < JsonTodo > ( context . Request . Body ) ;
2466
+ context . Request . Body . Position = 0 ;
2467
+ return body ;
2468
+ }
2469
+ }
2470
+
2402
2471
private record struct TodoStruct ( int Id , string ? Name , bool IsComplete ) : ITodo ;
2403
2472
2404
2473
private interface ITodo
0 commit comments