|
9 | 9 | using Microsoft.AspNetCore.Http.Features.Authentication;
|
10 | 10 | using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
|
11 | 11 |
|
| 12 | +#nullable enable |
| 13 | + |
12 | 14 | namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
|
13 | 15 | {
|
14 | 16 | internal partial class HttpProtocol : IFeatureCollection
|
15 | 17 | {
|
16 |
| - private object _currentIHttpRequestFeature; |
17 |
| - private object _currentIHttpRequestBodyDetectionFeature; |
18 |
| - private object _currentIHttpResponseFeature; |
19 |
| - private object _currentIHttpResponseBodyFeature; |
20 |
| - private object _currentIRequestBodyPipeFeature; |
21 |
| - private object _currentIHttpRequestIdentifierFeature; |
22 |
| - private object _currentIServiceProvidersFeature; |
23 |
| - private object _currentIHttpRequestLifetimeFeature; |
24 |
| - private object _currentIHttpConnectionFeature; |
25 |
| - private object _currentIRouteValuesFeature; |
26 |
| - private object _currentIEndpointFeature; |
27 |
| - private object _currentIHttpAuthenticationFeature; |
28 |
| - private object _currentIHttpRequestTrailersFeature; |
29 |
| - private object _currentIQueryFeature; |
30 |
| - private object _currentIFormFeature; |
31 |
| - private object _currentIHttpUpgradeFeature; |
32 |
| - private object _currentIHttp2StreamIdFeature; |
33 |
| - private object _currentIHttpResponseTrailersFeature; |
34 |
| - private object _currentIResponseCookiesFeature; |
35 |
| - private object _currentIItemsFeature; |
36 |
| - private object _currentITlsConnectionFeature; |
37 |
| - private object _currentIHttpWebSocketFeature; |
38 |
| - private object _currentISessionFeature; |
39 |
| - private object _currentIHttpMaxRequestBodySizeFeature; |
40 |
| - private object _currentIHttpMinRequestBodyDataRateFeature; |
41 |
| - private object _currentIHttpMinResponseDataRateFeature; |
42 |
| - private object _currentIHttpBodyControlFeature; |
43 |
| - private object _currentIHttpResetFeature; |
| 18 | + private object? _currentIHttpRequestFeature; |
| 19 | + private object? _currentIHttpRequestBodyDetectionFeature; |
| 20 | + private object? _currentIHttpResponseFeature; |
| 21 | + private object? _currentIHttpResponseBodyFeature; |
| 22 | + private object? _currentIRequestBodyPipeFeature; |
| 23 | + private object? _currentIHttpRequestIdentifierFeature; |
| 24 | + private object? _currentIServiceProvidersFeature; |
| 25 | + private object? _currentIHttpRequestLifetimeFeature; |
| 26 | + private object? _currentIHttpConnectionFeature; |
| 27 | + private object? _currentIRouteValuesFeature; |
| 28 | + private object? _currentIEndpointFeature; |
| 29 | + private object? _currentIHttpAuthenticationFeature; |
| 30 | + private object? _currentIHttpRequestTrailersFeature; |
| 31 | + private object? _currentIQueryFeature; |
| 32 | + private object? _currentIFormFeature; |
| 33 | + private object? _currentIHttpUpgradeFeature; |
| 34 | + private object? _currentIHttp2StreamIdFeature; |
| 35 | + private object? _currentIHttpResponseTrailersFeature; |
| 36 | + private object? _currentIResponseCookiesFeature; |
| 37 | + private object? _currentIItemsFeature; |
| 38 | + private object? _currentITlsConnectionFeature; |
| 39 | + private object? _currentIHttpWebSocketFeature; |
| 40 | + private object? _currentISessionFeature; |
| 41 | + private object? _currentIHttpMaxRequestBodySizeFeature; |
| 42 | + private object? _currentIHttpMinRequestBodyDataRateFeature; |
| 43 | + private object? _currentIHttpMinResponseDataRateFeature; |
| 44 | + private object? _currentIHttpBodyControlFeature; |
| 45 | + private object? _currentIHttpResetFeature; |
44 | 46 |
|
45 | 47 | private int _featureRevision;
|
46 | 48 |
|
47 |
| - private List<KeyValuePair<Type, object>> MaybeExtra; |
| 49 | + private List<KeyValuePair<Type, object>>? MaybeExtra; |
48 | 50 |
|
49 | 51 | private void FastReset()
|
50 | 52 | {
|
@@ -87,7 +89,7 @@ internal void ResetFeatureCollection()
|
87 | 89 | _featureRevision++;
|
88 | 90 | }
|
89 | 91 |
|
90 |
| - private object ExtraFeatureGet(Type key) |
| 92 | + private object? ExtraFeatureGet(Type key) |
91 | 93 | {
|
92 | 94 | if (MaybeExtra == null)
|
93 | 95 | {
|
@@ -126,11 +128,11 @@ private void ExtraFeatureSet(Type key, object value)
|
126 | 128 |
|
127 | 129 | int IFeatureCollection.Revision => _featureRevision;
|
128 | 130 |
|
129 |
| - object IFeatureCollection.this[Type key] |
| 131 | + object? IFeatureCollection.this[Type key] |
130 | 132 | {
|
131 | 133 | get
|
132 | 134 | {
|
133 |
| - object feature = null; |
| 135 | + object? feature = null; |
134 | 136 | if (key == typeof(IHttpRequestFeature))
|
135 | 137 | {
|
136 | 138 | feature = _currentIHttpRequestFeature;
|
@@ -369,129 +371,129 @@ object IFeatureCollection.this[Type key]
|
369 | 371 | }
|
370 | 372 | else
|
371 | 373 | {
|
372 |
| - ExtraFeatureSet(key, value); |
| 374 | + ExtraFeatureSet(key, value!); // TODO: What happens if you set an extra feature with a null value? |
373 | 375 | }
|
374 | 376 | }
|
375 | 377 | }
|
376 | 378 |
|
377 | 379 | TFeature IFeatureCollection.Get<TFeature>()
|
378 | 380 | {
|
379 |
| - TFeature feature = default; |
| 381 | + TFeature? feature = default; |
380 | 382 | if (typeof(TFeature) == typeof(IHttpRequestFeature))
|
381 | 383 | {
|
382 |
| - feature = (TFeature)_currentIHttpRequestFeature; |
| 384 | + feature = (TFeature?)_currentIHttpRequestFeature; |
383 | 385 | }
|
384 | 386 | else if (typeof(TFeature) == typeof(IHttpRequestBodyDetectionFeature))
|
385 | 387 | {
|
386 |
| - feature = (TFeature)_currentIHttpRequestBodyDetectionFeature; |
| 388 | + feature = (TFeature?)_currentIHttpRequestBodyDetectionFeature; |
387 | 389 | }
|
388 | 390 | else if (typeof(TFeature) == typeof(IHttpResponseFeature))
|
389 | 391 | {
|
390 |
| - feature = (TFeature)_currentIHttpResponseFeature; |
| 392 | + feature = (TFeature?)_currentIHttpResponseFeature; |
391 | 393 | }
|
392 | 394 | else if (typeof(TFeature) == typeof(IHttpResponseBodyFeature))
|
393 | 395 | {
|
394 |
| - feature = (TFeature)_currentIHttpResponseBodyFeature; |
| 396 | + feature = (TFeature?)_currentIHttpResponseBodyFeature; |
395 | 397 | }
|
396 | 398 | else if (typeof(TFeature) == typeof(IRequestBodyPipeFeature))
|
397 | 399 | {
|
398 |
| - feature = (TFeature)_currentIRequestBodyPipeFeature; |
| 400 | + feature = (TFeature?)_currentIRequestBodyPipeFeature; |
399 | 401 | }
|
400 | 402 | else if (typeof(TFeature) == typeof(IHttpRequestIdentifierFeature))
|
401 | 403 | {
|
402 |
| - feature = (TFeature)_currentIHttpRequestIdentifierFeature; |
| 404 | + feature = (TFeature?)_currentIHttpRequestIdentifierFeature; |
403 | 405 | }
|
404 | 406 | else if (typeof(TFeature) == typeof(IServiceProvidersFeature))
|
405 | 407 | {
|
406 |
| - feature = (TFeature)_currentIServiceProvidersFeature; |
| 408 | + feature = (TFeature?)_currentIServiceProvidersFeature; |
407 | 409 | }
|
408 | 410 | else if (typeof(TFeature) == typeof(IHttpRequestLifetimeFeature))
|
409 | 411 | {
|
410 |
| - feature = (TFeature)_currentIHttpRequestLifetimeFeature; |
| 412 | + feature = (TFeature?)_currentIHttpRequestLifetimeFeature; |
411 | 413 | }
|
412 | 414 | else if (typeof(TFeature) == typeof(IHttpConnectionFeature))
|
413 | 415 | {
|
414 |
| - feature = (TFeature)_currentIHttpConnectionFeature; |
| 416 | + feature = (TFeature?)_currentIHttpConnectionFeature; |
415 | 417 | }
|
416 | 418 | else if (typeof(TFeature) == typeof(IRouteValuesFeature))
|
417 | 419 | {
|
418 |
| - feature = (TFeature)_currentIRouteValuesFeature; |
| 420 | + feature = (TFeature?)_currentIRouteValuesFeature; |
419 | 421 | }
|
420 | 422 | else if (typeof(TFeature) == typeof(IEndpointFeature))
|
421 | 423 | {
|
422 |
| - feature = (TFeature)_currentIEndpointFeature; |
| 424 | + feature = (TFeature?)_currentIEndpointFeature; |
423 | 425 | }
|
424 | 426 | else if (typeof(TFeature) == typeof(IHttpAuthenticationFeature))
|
425 | 427 | {
|
426 |
| - feature = (TFeature)_currentIHttpAuthenticationFeature; |
| 428 | + feature = (TFeature?)_currentIHttpAuthenticationFeature; |
427 | 429 | }
|
428 | 430 | else if (typeof(TFeature) == typeof(IHttpRequestTrailersFeature))
|
429 | 431 | {
|
430 |
| - feature = (TFeature)_currentIHttpRequestTrailersFeature; |
| 432 | + feature = (TFeature?)_currentIHttpRequestTrailersFeature; |
431 | 433 | }
|
432 | 434 | else if (typeof(TFeature) == typeof(IQueryFeature))
|
433 | 435 | {
|
434 |
| - feature = (TFeature)_currentIQueryFeature; |
| 436 | + feature = (TFeature?)_currentIQueryFeature; |
435 | 437 | }
|
436 | 438 | else if (typeof(TFeature) == typeof(IFormFeature))
|
437 | 439 | {
|
438 |
| - feature = (TFeature)_currentIFormFeature; |
| 440 | + feature = (TFeature?)_currentIFormFeature; |
439 | 441 | }
|
440 | 442 | else if (typeof(TFeature) == typeof(IHttpUpgradeFeature))
|
441 | 443 | {
|
442 |
| - feature = (TFeature)_currentIHttpUpgradeFeature; |
| 444 | + feature = (TFeature?)_currentIHttpUpgradeFeature; |
443 | 445 | }
|
444 | 446 | else if (typeof(TFeature) == typeof(IHttp2StreamIdFeature))
|
445 | 447 | {
|
446 |
| - feature = (TFeature)_currentIHttp2StreamIdFeature; |
| 448 | + feature = (TFeature?)_currentIHttp2StreamIdFeature; |
447 | 449 | }
|
448 | 450 | else if (typeof(TFeature) == typeof(IHttpResponseTrailersFeature))
|
449 | 451 | {
|
450 |
| - feature = (TFeature)_currentIHttpResponseTrailersFeature; |
| 452 | + feature = (TFeature?)_currentIHttpResponseTrailersFeature; |
451 | 453 | }
|
452 | 454 | else if (typeof(TFeature) == typeof(IResponseCookiesFeature))
|
453 | 455 | {
|
454 |
| - feature = (TFeature)_currentIResponseCookiesFeature; |
| 456 | + feature = (TFeature?)_currentIResponseCookiesFeature; |
455 | 457 | }
|
456 | 458 | else if (typeof(TFeature) == typeof(IItemsFeature))
|
457 | 459 | {
|
458 |
| - feature = (TFeature)_currentIItemsFeature; |
| 460 | + feature = (TFeature?)_currentIItemsFeature; |
459 | 461 | }
|
460 | 462 | else if (typeof(TFeature) == typeof(ITlsConnectionFeature))
|
461 | 463 | {
|
462 |
| - feature = (TFeature)_currentITlsConnectionFeature; |
| 464 | + feature = (TFeature?)_currentITlsConnectionFeature; |
463 | 465 | }
|
464 | 466 | else if (typeof(TFeature) == typeof(IHttpWebSocketFeature))
|
465 | 467 | {
|
466 |
| - feature = (TFeature)_currentIHttpWebSocketFeature; |
| 468 | + feature = (TFeature?)_currentIHttpWebSocketFeature; |
467 | 469 | }
|
468 | 470 | else if (typeof(TFeature) == typeof(ISessionFeature))
|
469 | 471 | {
|
470 |
| - feature = (TFeature)_currentISessionFeature; |
| 472 | + feature = (TFeature?)_currentISessionFeature; |
471 | 473 | }
|
472 | 474 | else if (typeof(TFeature) == typeof(IHttpMaxRequestBodySizeFeature))
|
473 | 475 | {
|
474 |
| - feature = (TFeature)_currentIHttpMaxRequestBodySizeFeature; |
| 476 | + feature = (TFeature?)_currentIHttpMaxRequestBodySizeFeature; |
475 | 477 | }
|
476 | 478 | else if (typeof(TFeature) == typeof(IHttpMinRequestBodyDataRateFeature))
|
477 | 479 | {
|
478 |
| - feature = (TFeature)_currentIHttpMinRequestBodyDataRateFeature; |
| 480 | + feature = (TFeature?)_currentIHttpMinRequestBodyDataRateFeature; |
479 | 481 | }
|
480 | 482 | else if (typeof(TFeature) == typeof(IHttpMinResponseDataRateFeature))
|
481 | 483 | {
|
482 |
| - feature = (TFeature)_currentIHttpMinResponseDataRateFeature; |
| 484 | + feature = (TFeature?)_currentIHttpMinResponseDataRateFeature; |
483 | 485 | }
|
484 | 486 | else if (typeof(TFeature) == typeof(IHttpBodyControlFeature))
|
485 | 487 | {
|
486 |
| - feature = (TFeature)_currentIHttpBodyControlFeature; |
| 488 | + feature = (TFeature?)_currentIHttpBodyControlFeature; |
487 | 489 | }
|
488 | 490 | else if (typeof(TFeature) == typeof(IHttpResetFeature))
|
489 | 491 | {
|
490 |
| - feature = (TFeature)_currentIHttpResetFeature; |
| 492 | + feature = (TFeature?)_currentIHttpResetFeature; |
491 | 493 | }
|
492 | 494 | else if (MaybeExtra != null)
|
493 | 495 | {
|
494 |
| - feature = (TFeature)(ExtraFeatureGet(typeof(TFeature))); |
| 496 | + feature = (TFeature?)(ExtraFeatureGet(typeof(TFeature))); |
495 | 497 | }
|
496 | 498 |
|
497 | 499 | if (feature == null)
|
@@ -619,7 +621,7 @@ void IFeatureCollection.Set<TFeature>(TFeature feature)
|
619 | 621 | }
|
620 | 622 | else
|
621 | 623 | {
|
622 |
| - ExtraFeatureSet(typeof(TFeature), feature); |
| 624 | + ExtraFeatureSet(typeof(TFeature), feature!); // TODO: What happens if you set an extra feature with a null value? |
623 | 625 | }
|
624 | 626 | }
|
625 | 627 |
|
|
0 commit comments