Skip to content
This repository was archived by the owner on Nov 20, 2018. It is now read-only.

Commit c721ea4

Browse files
committed
Reduce revision amplication
1 parent e638979 commit c721ea4

File tree

4 files changed

+37
-26
lines changed

4 files changed

+37
-26
lines changed

src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ public FeatureReferences(IFeatureCollection collection)
1515
Revision = collection.Revision;
1616
}
1717

18+
public FeatureReferences(IFeatureCollection collection, int featuresVersion)
19+
{
20+
Collection = collection;
21+
Cache = default(TCache);
22+
Revision = featuresVersion;
23+
}
24+
1825
public IFeatureCollection Collection { get; private set; }
1926
public int Revision { get; private set; }
2027

src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,17 @@ public DefaultHttpContext()
4242

4343
public DefaultHttpContext(IFeatureCollection features)
4444
{
45-
_features = new FeatureReferences<FeatureInterfaces>(features);
46-
_request = new DefaultHttpRequest(this);
47-
_response = new DefaultHttpResponse(this);
45+
Initialize(features);
46+
}
47+
48+
public void Initialize(IFeatureCollection features)
49+
{
50+
var featuresVersion = features.Revision;
51+
52+
// Speculatively populate always used features for current version
53+
_features = new FeatureReferences<FeatureInterfaces>(features, featuresVersion);
54+
_request.Initialize(features, featuresVersion);
55+
_response.Initialize(features, featuresVersion);
4856
}
4957

5058
private IItemsFeature ItemsFeature =>
@@ -155,13 +163,6 @@ public override void Abort()
155163
[MethodImpl(MethodImplOptions.NoInlining)]
156164
private WebSocketManager InitializeWebSocketManager() => (_websockets = new DefaultWebSocketManager(Features));
157165

158-
public void Initialize(IFeatureCollection features)
159-
{
160-
_features = new FeatureReferences<FeatureInterfaces>(features);
161-
_request.Initialize(features);
162-
_response.Initialize(features);
163-
}
164-
165166
public void Uninitialize()
166167
{
167168
_features = default(FeatureReferences<FeatureInterfaces>);

src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,19 @@ public sealed class DefaultHttpRequest : HttpRequest
1818
private readonly static Func<HttpRequest, IFormFeature> _newFormFeature = r => new FormFeature(r);
1919
private readonly static Func<IFeatureCollection, IRequestCookiesFeature> _newRequestCookiesFeature = f => new RequestCookiesFeature(f);
2020

21-
private DefaultHttpContext _context;
21+
private readonly DefaultHttpContext _context;
2222
private FeatureReferences<FeatureInterfaces> _features;
2323

24-
public DefaultHttpRequest(DefaultHttpContext context)
24+
public DefaultHttpRequest(DefaultHttpContext context, int featuresVersion)
2525
{
2626
_context = context;
27-
_features = new FeatureReferences<FeatureInterfaces>(context.Features);
27+
Initialize(context.Features, featuresVersion);
28+
}
29+
30+
public void Initialize(IFeatureCollection features, int featuresVersion)
31+
{
32+
// Speculatively populate always used features for current version
33+
_features = new FeatureReferences<FeatureInterfaces>(features, featuresVersion);
2834
}
2935

3036
public override HttpContext HttpContext => _context;
@@ -140,11 +146,6 @@ public override Task<IFormCollection> ReadFormAsync(CancellationToken cancellati
140146
return FormFeature.ReadFormAsync(cancellationToken);
141147
}
142148

143-
public void Initialize(IFeatureCollection features)
144-
{
145-
_features = new FeatureReferences<FeatureInterfaces>(features);
146-
}
147-
148149
public void Uninitialize()
149150
{
150151
_features = default(FeatureReferences<FeatureInterfaces>);

src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,20 @@ public sealed class DefaultHttpResponse : HttpResponse
1515
private readonly static Func<IFeatureCollection, IHttpResponseFeature> _nullResponseFeature = f => null;
1616
private readonly static Func<IFeatureCollection, IResponseCookiesFeature> _newResponseCookiesFeature = f => new ResponseCookiesFeature(f);
1717

18-
private DefaultHttpContext _context;
18+
private readonly DefaultHttpContext _context;
1919
private FeatureReferences<FeatureInterfaces> _features;
2020

21-
public DefaultHttpResponse(DefaultHttpContext context)
21+
public DefaultHttpResponse(DefaultHttpContext context, int featuresVersion)
2222
{
2323
_context = context;
24-
_features = new FeatureReferences<FeatureInterfaces>(context.Features);
24+
Initialize(context.Features, featuresVersion);
25+
}
26+
27+
public void Initialize(IFeatureCollection features, int featuresVersion)
28+
{
29+
// Speculatively populate always used features for current version
30+
_features = new FeatureReferences<FeatureInterfaces>(features, featuresVersion);
31+
_features.Cache.Response = (IHttpResponseFeature)features[typeof(IHttpResponseFeature)];
2532
}
2633

2734
private IHttpResponseFeature HttpResponseFeature =>
@@ -119,11 +126,6 @@ public override void Redirect(string location, bool permanent)
119126
Headers[HeaderNames.Location] = location;
120127
}
121128

122-
public void Initialize(IFeatureCollection features)
123-
{
124-
_features = new FeatureReferences<FeatureInterfaces>(features);
125-
}
126-
127129
public void Uninitialize()
128130
{
129131
_features = default(FeatureReferences<FeatureInterfaces>);

0 commit comments

Comments
 (0)