Skip to content

Commit 6433126

Browse files
committed
Pool deeper and make sure not to break overridden methods
1 parent a501073 commit 6433126

File tree

4 files changed

+87
-8
lines changed

4 files changed

+87
-8
lines changed

src/Http/Http/src/DefaultHttpContext.cs

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,92 @@ public DefaultHttpContext(IFeatureCollection features)
5151
public virtual void Initialize(IFeatureCollection features)
5252
{
5353
_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+
}
5686
}
5787

5888
public virtual void Uninitialize()
5989
{
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+
{
61140
if (_request != null)
62141
{
63142
UninitializeHttpRequest(_request);

src/Http/Http/src/Internal/DefaultHttpRequest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public virtual void Initialize(HttpContext context)
3737
public virtual void Uninitialize()
3838
{
3939
_context = null;
40-
_features = default(FeatureReferences<FeatureInterfaces>);
40+
_features = default;
4141
}
4242

4343
public override HttpContext HttpContext => _context;
@@ -171,4 +171,4 @@ struct FeatureInterfaces
171171
public IRouteValuesFeature RouteValues;
172172
}
173173
}
174-
}
174+
}

src/Http/Http/src/Internal/DefaultHttpResponse.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public virtual void Initialize(HttpContext context)
3232
public virtual void Uninitialize()
3333
{
3434
_context = null;
35-
_features = default(FeatureReferences<FeatureInterfaces>);
35+
_features = default;
3636
}
3737

3838
private IHttpResponseFeature HttpResponseFeature =>
@@ -136,4 +136,4 @@ struct FeatureInterfaces
136136
public IResponseCookiesFeature Cookies;
137137
}
138138
}
139-
}
139+
}

src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public HttpProtocol(HttpConnectionContext context)
9898
public long? MaxRequestBodySize { get; set; }
9999
public bool AllowSynchronousIO { get; set; }
100100

101-
// Cache teh HttpContext per Connection/Http2Stream
101+
// Caches the HttpContext allocation
102102
internal DefaultHttpContext HttpContext { get; set; }
103103

104104
/// <summary>

0 commit comments

Comments
 (0)