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

Commit f475e53

Browse files
committed
#367 Add HttpContext.Features, move Get/SetFeature. Take 1.
1 parent 59b44a4 commit f475e53

File tree

11 files changed

+69
-34
lines changed

11 files changed

+69
-34
lines changed

src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ namespace Microsoft.AspNet.Http
1212
{
1313
public abstract class HttpContext : IDisposable
1414
{
15+
public abstract IFeatureCollection Features { get; }
16+
1517
public abstract HttpRequest Request { get; }
1618

1719
public abstract HttpResponse Response { get; }

src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static class SendFileResponseExtensions
2222
/// <returns>True if sendfile feature exists in the response.</returns>
2323
public static bool SupportsSendFile([NotNull] this HttpResponse response)
2424
{
25-
return response.HttpContext.GetFeature<IHttpSendFileFeature>() != null;
25+
return response.HttpContext.Features.Get<IHttpSendFileFeature>() != null;
2626
}
2727

2828
/// <summary>
@@ -47,7 +47,7 @@ public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull]
4747
/// <returns></returns>
4848
public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken)
4949
{
50-
var sendFile = response.HttpContext.GetFeature<IHttpSendFileFeature>();
50+
var sendFile = response.HttpContext.Features.Get<IHttpSendFileFeature>();
5151
if (sendFile == null)
5252
{
5353
throw new NotSupportedException(Resources.Exception_SendFileNotSupported);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
namespace Microsoft.AspNet.Http.Features
5+
{
6+
public static class FeatureCollectionExtensions
7+
{
8+
/// <summary>
9+
/// Retrieves the requested feature from the collection.
10+
/// </summary>
11+
/// <typeparam name="TFeature">The feature key.</typeparam>
12+
/// <param name="features">The collection.</param>
13+
/// <returns>The requested feature, or null if it is not present.</returns>
14+
public static TFeature Get<TFeature>(this IFeatureCollection features)
15+
{
16+
return (TFeature)features[typeof(TFeature)];
17+
}
18+
19+
/// <summary>
20+
/// Sets the given feature in the collection.
21+
/// </summary>
22+
/// <typeparam name="TFeature">The feature key.</typeparam>
23+
/// <param name="features">The collection.</param>
24+
/// <param name="instance">The feature value.</param>
25+
public static void Set<TFeature>(this IFeatureCollection features, TFeature instance)
26+
{
27+
features[typeof(TFeature)] = instance;
28+
}
29+
}
30+
}

src/Microsoft.AspNet.Http/DefaultHttpContext.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public class DefaultHttpContext : HttpContext
3232
public DefaultHttpContext()
3333
: this(new FeatureCollection())
3434
{
35-
SetFeature<IHttpRequestFeature>(new HttpRequestFeature());
36-
SetFeature<IHttpResponseFeature>(new HttpResponseFeature());
35+
_features.Set<IHttpRequestFeature>(new HttpRequestFeature());
36+
_features.Set<IHttpResponseFeature>(new HttpResponseFeature());
3737
}
3838

3939
public DefaultHttpContext(IFeatureCollection features)
@@ -76,6 +76,8 @@ private ISessionFeature SessionFeature
7676
get { return _session.Fetch(_features); }
7777
}
7878

79+
public override IFeatureCollection Features { get { return _features; } }
80+
7981
public override HttpRequest Request { get { return _request; } }
8082

8183
public override HttpResponse Response { get { return _response; } }

src/Microsoft.AspNet.Owin/OwinEnvironment.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public class OwinEnvironment : IDictionary<string, object>
3737

3838
public OwinEnvironment(HttpContext context)
3939
{
40-
if (context.GetFeature<IHttpRequestFeature>() == null)
40+
if (context.Features.Get<IHttpRequestFeature>() == null)
4141
{
4242
throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", nameof(context));
4343
}
44-
if (context.GetFeature<IHttpResponseFeature>() == null)
44+
if (context.Features.Get<IHttpResponseFeature>() == null)
4545
{
4646
throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", nameof(context));
4747
}
@@ -100,7 +100,7 @@ public OwinEnvironment(HttpContext context)
100100
};
101101

102102
// owin.CallCancelled is required but the feature may not be present.
103-
if (context.GetFeature<IHttpRequestLifetimeFeature>() != null)
103+
if (context.Features.Get<IHttpRequestLifetimeFeature>() != null)
104104
{
105105
_entries[OwinConstants.CallCancelled] = new FeatureMap<IHttpRequestLifetimeFeature>(feature => feature.RequestAborted);
106106
}
@@ -334,7 +334,7 @@ public bool CanSet
334334

335335
internal bool TryGet(HttpContext context, out object value)
336336
{
337-
object featureInstance = context.GetFeature(FeatureInterface);
337+
object featureInstance = context.Features[FeatureInterface];
338338
if (featureInstance == null)
339339
{
340340
value = null;
@@ -350,7 +350,7 @@ internal bool TryGet(HttpContext context, out object value)
350350

351351
internal void Set(HttpContext context, object value)
352352
{
353-
var feature = context.GetFeature(FeatureInterface);
353+
var feature = context.Features[FeatureInterface];
354354
if (feature == null)
355355
{
356356
if (FeatureFactory == null)
@@ -360,7 +360,7 @@ internal void Set(HttpContext context, object value)
360360
else
361361
{
362362
feature = FeatureFactory();
363-
context.SetFeature(FeatureInterface, feature);
363+
context.Features[FeatureInterface] = feature;
364364
}
365365
}
366366
Setter(feature, value);

src/Microsoft.AspNet.Owin/OwinExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static AddMiddleware UseOwin(this IApplicationBuilder builder)
3939
{
4040
// Use the existing OWIN env if there is one.
4141
IDictionary<string, object> env;
42-
var owinEnvFeature = httpContext.GetFeature<IOwinEnvironmentFeature>();
42+
var owinEnvFeature = httpContext.Features.Get<IOwinEnvironmentFeature>();
4343
if (owinEnvFeature != null)
4444
{
4545
env = owinEnvFeature.Environment;
@@ -87,7 +87,7 @@ private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, Re
8787
{
8888
var app = middleware(httpContext =>
8989
{
90-
return next(httpContext.GetFeature<IOwinEnvironmentFeature>().Environment);
90+
return next(httpContext.Features.Get<IOwinEnvironmentFeature>().Environment);
9191
});
9292

9393
return env =>
@@ -98,7 +98,7 @@ private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, Re
9898
if (env.TryGetValue(typeof(HttpContext).FullName, out obj))
9999
{
100100
context = (HttpContext)obj;
101-
context.SetFeature<IOwinEnvironmentFeature>(new OwinEnvironmentFeature() { Environment = env });
101+
context.Features.Set<IOwinEnvironmentFeature>(new OwinEnvironmentFeature() { Environment = env });
102102
}
103103
else
104104
{

test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public void SendFileSupport()
1717
var context = new DefaultHttpContext();
1818
var response = context.Response;
1919
Assert.False(response.SupportsSendFile());
20-
context.SetFeature<IHttpSendFileFeature>(new FakeSendFileFeature());
20+
context.Features.Set<IHttpSendFileFeature>(new FakeSendFileFeature());
2121
Assert.True(response.SupportsSendFile());
2222
}
2323

@@ -34,7 +34,7 @@ public async Task SendFileWorks()
3434
var context = new DefaultHttpContext();
3535
var response = context.Response;
3636
var fakeFeature = new FakeSendFileFeature();
37-
context.SetFeature<IHttpSendFileFeature>(fakeFeature);
37+
context.Features.Set<IHttpSendFileFeature>(fakeFeature);
3838

3939
await response.SendFileAsync("bob", 1, 3, CancellationToken.None);
4040

test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Security.Claims;
66
using System.Threading.Tasks;
7+
using Microsoft.AspNet.Http.Features;
78
using Microsoft.AspNet.Http.Features.Authentication;
89
using Microsoft.AspNet.Http.Features.Authentication.Internal;
910
using Microsoft.AspNet.Http.Internal;
@@ -50,7 +51,7 @@ public async Task SignInOutIn()
5051
{
5152
var context = CreateContext();
5253
var handler = new AuthHandler();
53-
context.SetFeature<IHttpAuthenticationFeature>(new HttpAuthenticationFeature() { Handler = handler });
54+
context.Features.Set<IHttpAuthenticationFeature>(new HttpAuthenticationFeature() { Handler = handler });
5455
var user = new ClaimsPrincipal();
5556
await context.Authentication.SignInAsync("ignored", user);
5657
Assert.True(handler.SignedIn);

test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void GetOnSessionProperty_ReturnsAvailableSession()
3535
session.Set("key2", null);
3636
var feature = new BlahSessionFeature();
3737
feature.Session = session;
38-
context.SetFeature<ISessionFeature>(feature);
38+
context.Features.Set<ISessionFeature>(feature);
3939

4040
// Act & Assert
4141
Assert.Same(session, context.Session);
@@ -67,7 +67,7 @@ public void SettingSession_OverridesAvailableSession()
6767
session.Set("key2", null);
6868
var feature = new BlahSessionFeature();
6969
feature.Session = session;
70-
context.SetFeature<ISessionFeature>(feature);
70+
context.Features.Set<ISessionFeature>(feature);
7171

7272
// Act
7373
context.Session = new TestSession();
@@ -109,9 +109,9 @@ public void EmptyUserIsNeverNull()
109109
public void GetItems_DefaultCollectionProvided()
110110
{
111111
var context = new DefaultHttpContext(new FeatureCollection());
112-
Assert.Null(context.GetFeature<IItemsFeature>());
112+
Assert.Null(context.Features.Get<IItemsFeature>());
113113
var items = context.Items;
114-
Assert.NotNull(context.GetFeature<IItemsFeature>());
114+
Assert.NotNull(context.Features.Get<IItemsFeature>());
115115
Assert.NotNull(items);
116116
Assert.Same(items, context.Items);
117117
var item = new object();
@@ -123,10 +123,10 @@ public void GetItems_DefaultCollectionProvided()
123123
public void SetItems_NewCollectionUsed()
124124
{
125125
var context = new DefaultHttpContext(new FeatureCollection());
126-
Assert.Null(context.GetFeature<IItemsFeature>());
126+
Assert.Null(context.Features.Get<IItemsFeature>());
127127
var items = new Dictionary<object, object>();
128128
context.Items = items;
129-
Assert.NotNull(context.GetFeature<IItemsFeature>());
129+
Assert.NotNull(context.Features.Get<IItemsFeature>());
130130
Assert.Same(items, context.Items);
131131
var item = new object();
132132
items["foo"] = item;

test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public void IsHttps_CorrectlyReflectsScheme()
136136
public void Query_GetAndSet()
137137
{
138138
var request = new DefaultHttpContext().Request;
139-
var requestFeature = request.HttpContext.GetFeature<IHttpRequestFeature>();
139+
var requestFeature = request.HttpContext.Features.Get<IHttpRequestFeature>();
140140
Assert.Equal(string.Empty, requestFeature.QueryString);
141141
Assert.Equal(QueryString.Empty, request.QueryString);
142142
var query0 = request.Query;
@@ -191,7 +191,7 @@ public void Cookies_GetAndSet()
191191
private static HttpRequest CreateRequest(IDictionary<string, StringValues> headers)
192192
{
193193
var context = new DefaultHttpContext();
194-
context.GetFeature<IHttpRequestFeature>().Headers = headers;
194+
context.Features.Get<IHttpRequestFeature>().Headers = headers;
195195
return context.Request;
196196
}
197197

test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public async Task ReadFormAsync_SimpleData_ReturnsParsedFormCollection()
2323
context.Request.Body = new MemoryStream(formContent);
2424

2525
// Not cached yet
26-
var formFeature = context.GetFeature<IFormFeature>();
26+
var formFeature = context.Features.Get<IFormFeature>();
2727
Assert.Null(formFeature);
2828

2929
// Act
@@ -34,7 +34,7 @@ public async Task ReadFormAsync_SimpleData_ReturnsParsedFormCollection()
3434
Assert.Equal("2", formCollection["baz"]);
3535

3636
// Cached
37-
formFeature = context.GetFeature<IFormFeature>();
37+
formFeature = context.Features.Get<IFormFeature>();
3838
Assert.NotNull(formFeature);
3939
Assert.NotNull(formFeature.Form);
4040
Assert.Same(formFeature.Form, formCollection);
@@ -132,15 +132,15 @@ public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection()
132132
context.Request.Body = new MemoryStream(formContent);
133133

134134
// Not cached yet
135-
var formFeature = context.GetFeature<IFormFeature>();
135+
var formFeature = context.Features.Get<IFormFeature>();
136136
Assert.Null(formFeature);
137137

138138
var formCollection = context.Request.Form;
139139

140140
Assert.NotNull(formCollection);
141141

142142
// Cached
143-
formFeature = context.GetFeature<IFormFeature>();
143+
formFeature = context.Features.Get<IFormFeature>();
144144
Assert.NotNull(formFeature);
145145
Assert.NotNull(formFeature.Form);
146146
Assert.Same(formCollection, formFeature.Form);
@@ -161,15 +161,15 @@ public async Task ReadForm_MultipartWithField_ReturnsParsedFormCollection()
161161
context.Request.Body = new MemoryStream(formContent);
162162

163163
// Not cached yet
164-
var formFeature = context.GetFeature<IFormFeature>();
164+
var formFeature = context.Features.Get<IFormFeature>();
165165
Assert.Null(formFeature);
166166

167167
var formCollection = context.Request.Form;
168168

169169
Assert.NotNull(formCollection);
170170

171171
// Cached
172-
formFeature = context.GetFeature<IFormFeature>();
172+
formFeature = context.Features.Get<IFormFeature>();
173173
Assert.NotNull(formFeature);
174174
Assert.NotNull(formFeature.Form);
175175
Assert.Same(formCollection, formFeature.Form);
@@ -192,15 +192,15 @@ public async Task ReadFormAsync_MultipartWithFile_ReturnsParsedFormCollection()
192192
context.Request.Body = new MemoryStream(formContent);
193193

194194
// Not cached yet
195-
var formFeature = context.GetFeature<IFormFeature>();
195+
var formFeature = context.Features.Get<IFormFeature>();
196196
Assert.Null(formFeature);
197197

198198
var formCollection = await context.Request.ReadFormAsync();
199199

200200
Assert.NotNull(formCollection);
201201

202202
// Cached
203-
formFeature = context.GetFeature<IFormFeature>();
203+
formFeature = context.Features.Get<IFormFeature>();
204204
Assert.NotNull(formFeature);
205205
Assert.NotNull(formFeature.Form);
206206
Assert.Same(formFeature.Form, formCollection);
@@ -232,15 +232,15 @@ public async Task ReadFormAsync_MultipartWithFieldAndFile_ReturnsParsedFormColle
232232
context.Request.Body = new MemoryStream(formContent);
233233

234234
// Not cached yet
235-
var formFeature = context.GetFeature<IFormFeature>();
235+
var formFeature = context.Features.Get<IFormFeature>();
236236
Assert.Null(formFeature);
237237

238238
var formCollection = await context.Request.ReadFormAsync();
239239

240240
Assert.NotNull(formCollection);
241241

242242
// Cached
243-
formFeature = context.GetFeature<IFormFeature>();
243+
formFeature = context.Features.Get<IFormFeature>();
244244
Assert.NotNull(formFeature);
245245
Assert.NotNull(formFeature.Form);
246246
Assert.Same(formFeature.Form, formCollection);

0 commit comments

Comments
 (0)