@@ -51,13 +51,92 @@ public DefaultHttpContext(IFeatureCollection features)
51
51
public virtual void Initialize ( IFeatureCollection features )
52
52
{
53
53
_features = new FeatureReferences < FeatureInterfaces > ( features ) ;
54
- _request = InitializeHttpRequest ( ) ;
55
- _response = InitializeHttpResponse ( ) ;
54
+
55
+ if ( GetType ( ) != typeof ( DefaultHttpContext ) )
56
+ {
57
+ _request = InitializeHttpRequest ( ) ;
58
+ _response = InitializeHttpResponse ( ) ;
59
+ }
60
+ else
61
+ {
62
+ if ( _request is DefaultHttpRequest defaultHttpRequest )
63
+ {
64
+ defaultHttpRequest . Initialize ( this ) ;
65
+ }
66
+ else
67
+ {
68
+ _request = new DefaultHttpRequest ( this ) ;
69
+ }
70
+
71
+ if ( _response is DefaultHttpResponse defaultHttpResponse )
72
+ {
73
+ defaultHttpResponse . Initialize ( this ) ;
74
+ }
75
+ else
76
+ {
77
+ _response = new DefaultHttpResponse ( this ) ;
78
+ }
79
+
80
+ // Only set the ConnectionInfo if it was already allocated
81
+ if ( _connection is DefaultConnectionInfo defaultConnectionInfo )
82
+ {
83
+ defaultConnectionInfo . Initialize ( features ) ;
84
+ }
85
+ }
56
86
}
57
87
58
88
public virtual void Uninitialize ( )
59
89
{
60
- _features = default ( FeatureReferences < FeatureInterfaces > ) ;
90
+ _features = default ;
91
+
92
+ if ( GetType ( ) != typeof ( DefaultHttpContext ) )
93
+ {
94
+ // Avoid breaing backwards compatibility with the type check
95
+ UninitializeDerivedType ( ) ;
96
+ }
97
+ else
98
+ {
99
+ UninitializeForReuse ( ) ;
100
+ }
101
+ }
102
+
103
+ private void UninitializeForReuse ( )
104
+ {
105
+ if ( _request is DefaultHttpRequest defaultHttpRequest )
106
+ {
107
+ defaultHttpRequest . Uninitialize ( ) ;
108
+ }
109
+
110
+ if ( _response is DefaultHttpResponse defaultHttpResponse )
111
+ {
112
+ defaultHttpResponse . Uninitialize ( ) ;
113
+ }
114
+
115
+ // Even though this field is lazy, we will reuse it if it was created to avoid
116
+ // future allocations
117
+ if ( _connection is DefaultConnectionInfo defaultConnectionInfo )
118
+ {
119
+ defaultConnectionInfo . Uninitialize ( ) ;
120
+ }
121
+
122
+ // These fields are lazily initialized so we null them out
123
+
124
+ if ( _authenticationManager != null )
125
+ {
126
+ #pragma warning disable CS0618 // Type or member is obsolete
127
+ _authenticationManager = null ;
128
+ #pragma warning restore CS0618 // Type or member is obsolete
129
+ }
130
+
131
+ // It's unlikely that this would be reused
132
+ if ( _websockets != null )
133
+ {
134
+ _websockets = null ;
135
+ }
136
+ }
137
+
138
+ private void UninitializeDerivedType ( )
139
+ {
61
140
if ( _request != null )
62
141
{
63
142
UninitializeHttpRequest ( _request ) ;
0 commit comments