diff --git a/src/Kestrel.Core/Internal/Http/HttpProtocol.Generated.cs b/src/Kestrel.Core/Internal/Http/HttpProtocol.Generated.cs index 8a0223c96..f19c7ca2e 100644 --- a/src/Kestrel.Core/Internal/Http/HttpProtocol.Generated.cs +++ b/src/Kestrel.Core/Internal/Http/HttpProtocol.Generated.cs @@ -453,17 +453,16 @@ TFeature IFeatureCollection.Get() { feature = (TFeature)_currentIHttpSendFileFeature; } - else + else if (MaybeExtra != null) { feature = (TFeature)(ExtraFeatureGet(typeof(TFeature))); } - - if (feature != null) + else { - return feature; + feature = ConnectionFeatures.Get(); } - return (TFeature)ConnectionFeatures[typeof(TFeature)]; + return feature; } private IEnumerable> FastEnumerable() diff --git a/src/Kestrel.Transport.Abstractions/Internal/TransportConnection.Features.cs b/src/Kestrel.Transport.Abstractions/Internal/TransportConnection.Features.cs index 98308725e..46d514bdc 100644 --- a/src/Kestrel.Transport.Abstractions/Internal/TransportConnection.Features.cs +++ b/src/Kestrel.Transport.Abstractions/Internal/TransportConnection.Features.cs @@ -112,69 +112,101 @@ IDuplexPipe IConnectionTransportFeature.Application object IFeatureCollection.this[Type key] { - get => FastFeatureGet(key); - set => FastFeatureSet(key, value); - } + get + { + if (key == IHttpConnectionFeatureType) + { + return _currentIHttpConnectionFeature; + } - TFeature IFeatureCollection.Get() - { - return (TFeature)FastFeatureGet(typeof(TFeature)); - } + if (key == IConnectionIdFeatureType) + { + return _currentIConnectionIdFeature; + } - void IFeatureCollection.Set(TFeature instance) - { - FastFeatureSet(typeof(TFeature), instance); - } + if (key == IConnectionTransportFeatureType) + { + return _currentIConnectionTransportFeature; + } - IEnumerator> IEnumerable>.GetEnumerator() => FastEnumerable().GetEnumerator(); + if (MaybeExtra != null) + { + return ExtraFeatureGet(key); + } - IEnumerator IEnumerable.GetEnumerator() => FastEnumerable().GetEnumerator(); + return null; + } + set + { + _featureRevision++; - private object FastFeatureGet(Type key) + if (key == IHttpConnectionFeatureType) + { + _currentIHttpConnectionFeature = value; + } + else if (key == IConnectionIdFeatureType) + { + _currentIConnectionIdFeature = value; + } + else if (key == IConnectionTransportFeatureType) + { + _currentIConnectionTransportFeature = value; + } + else + { + ExtraFeatureSet(key, value); + } + } + } + + TFeature IFeatureCollection.Get() { - if (key == IHttpConnectionFeatureType) + if (typeof(TFeature) == typeof(IHttpConnectionFeature)) { - return _currentIHttpConnectionFeature; + return (TFeature)_currentIHttpConnectionFeature; } - - if (key == IConnectionIdFeatureType) + else if (typeof(TFeature) == typeof(IConnectionIdFeature)) { - return _currentIConnectionIdFeature; + return (TFeature)_currentIConnectionIdFeature; } - - if (key == IConnectionTransportFeatureType) + else if (typeof(TFeature) == typeof(IConnectionTransportFeature)) { - return _currentIConnectionTransportFeature; + return (TFeature)_currentIConnectionTransportFeature; + } + else if (MaybeExtra != null) + { + return (TFeature)ExtraFeatureGet(typeof(TFeature)); } - return ExtraFeatureGet(key); + return default; } - private void FastFeatureSet(Type key, object feature) + void IFeatureCollection.Set(TFeature instance) { _featureRevision++; - if (key == IHttpConnectionFeatureType) + if (typeof(TFeature) == typeof(IHttpConnectionFeature)) { - _currentIHttpConnectionFeature = feature; - return; + _currentIHttpConnectionFeature = instance; } - - if (key == IConnectionIdFeatureType) + else if (typeof(TFeature) == typeof(IConnectionIdFeature)) { - _currentIConnectionIdFeature = feature; - return; + _currentIConnectionIdFeature = instance; } - - if (key == IConnectionTransportFeatureType) + else if (typeof(TFeature) == typeof(IConnectionTransportFeature)) { - _currentIConnectionTransportFeature = feature; - return; + _currentIConnectionTransportFeature = instance; + } + else + { + ExtraFeatureSet(typeof(TFeature), instance); } - - ExtraFeatureSet(key, feature); } + IEnumerator> IEnumerable>.GetEnumerator() => FastEnumerable().GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => FastEnumerable().GetEnumerator(); + private IEnumerable> FastEnumerable() { if (_currentIHttpConnectionFeature != null) diff --git a/tools/CodeGenerator/HttpProtocolFeatureCollection.cs b/tools/CodeGenerator/HttpProtocolFeatureCollection.cs index f6dac4b97..7a97d9249 100644 --- a/tools/CodeGenerator/HttpProtocolFeatureCollection.cs +++ b/tools/CodeGenerator/HttpProtocolFeatureCollection.cs @@ -165,17 +165,16 @@ TFeature IFeatureCollection.Get() {{ feature = (TFeature)_current{feature.Name}; }}")} - else + else if (MaybeExtra != null) {{ feature = (TFeature)(ExtraFeatureGet(typeof(TFeature))); }} - - if (feature != null) + else {{ - return feature; + feature = ConnectionFeatures.Get(); }} - return (TFeature)ConnectionFeatures[typeof(TFeature)]; + return feature; }} private IEnumerable> FastEnumerable()