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

Commit e3c48bd

Browse files
committed
Use feature factories with curried state
1 parent bf5974d commit e3c48bd

File tree

4 files changed

+47
-18
lines changed

4 files changed

+47
-18
lines changed

src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Security.Claims;
7-
using System.Text;
87
using System.Threading;
98
using Microsoft.AspNetCore.Http.Authentication;
109
using Microsoft.AspNetCore.Http.Authentication.Internal;
1110
using Microsoft.AspNetCore.Http.Features;
1211
using Microsoft.AspNetCore.Http.Features.Authentication;
1312
using Microsoft.AspNetCore.Http.Internal;
14-
using Microsoft.Extensions.ObjectPool;
1513

1614
namespace Microsoft.AspNetCore.Http
1715
{
1816
public class DefaultHttpContext : HttpContext
1917
{
18+
private readonly Func<HttpRequest, FormFeature> _formFeatureFactory;
19+
private readonly Func<IFeatureCollection, ResponseCookiesFeature> _responseCookiesFeatureFactory;
20+
2021
private FeatureReferences<FeatureInterfaces> _features;
2122

2223
private HttpRequest _request;
@@ -25,20 +26,22 @@ public class DefaultHttpContext : HttpContext
2526
private ConnectionInfo _connection;
2627
private WebSocketManager _websockets;
2728

28-
public ObjectPool<StringBuilder> BuilderPool { get; private set; }
29-
public FormOptions FormOptions { get; private set; }
30-
3129
public DefaultHttpContext()
3230
: this(new FeatureCollection())
3331
{
3432
Features.Set<IHttpRequestFeature>(new HttpRequestFeature());
3533
Features.Set<IHttpResponseFeature>(new HttpResponseFeature());
3634
}
3735

38-
public DefaultHttpContext(IFeatureCollection features, ObjectPool<StringBuilder> builderPool = null, FormOptions formOptions = null)
36+
public DefaultHttpContext(IFeatureCollection features)
37+
: this(features, null, null)
38+
{
39+
}
40+
41+
public DefaultHttpContext(IFeatureCollection features, Func<IFeatureCollection, ResponseCookiesFeature> responseCookiesFeatureFactory, Func<HttpRequest, FormFeature> formFeatureFactory)
3942
{
40-
BuilderPool = builderPool;
41-
FormOptions = formOptions;
43+
_formFeatureFactory = formFeatureFactory;
44+
_responseCookiesFeatureFactory = responseCookiesFeatureFactory;
4245
Initialize(features);
4346
}
4447

@@ -179,10 +182,10 @@ public override void Abort()
179182
}
180183

181184

182-
protected virtual HttpRequest InitializeHttpRequest() => new DefaultHttpRequest(this);
185+
protected virtual HttpRequest InitializeHttpRequest() => new DefaultHttpRequest(this, _formFeatureFactory);
183186
protected virtual void UninitializeHttpRequest(HttpRequest instance) { }
184187

185-
protected virtual HttpResponse InitializeHttpResponse() => new DefaultHttpResponse(this);
188+
protected virtual HttpResponse InitializeHttpResponse() => new DefaultHttpResponse(this, _responseCookiesFeatureFactory);
186189
protected virtual void UninitializeHttpResponse(HttpResponse instance) { }
187190

188191
protected virtual ConnectionInfo InitializeConnectionInfo() => new DefaultConnectionInfo(Features);

src/Microsoft.AspNetCore.Http/HttpContextFactory.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5-
using System.Text;
65
using Microsoft.AspNetCore.Http.Features;
76
using Microsoft.Extensions.ObjectPool;
87
using Microsoft.Extensions.Options;
@@ -11,9 +10,9 @@ namespace Microsoft.AspNetCore.Http
1110
{
1211
public class HttpContextFactory : IHttpContextFactory
1312
{
14-
private readonly ObjectPool<StringBuilder> _builderPool;
1513
private readonly IHttpContextAccessor _httpContextAccessor;
16-
private readonly FormOptions _formOptions;
14+
private readonly Func<IFeatureCollection, ResponseCookiesFeature> _responseCookiesFeatureFactory;
15+
private readonly Func<HttpRequest, FormFeature> _formFeatureFactory;
1716

1817
public HttpContextFactory(ObjectPoolProvider poolProvider, IOptions<FormOptions> formOptions)
1918
: this(poolProvider, formOptions, httpContextAccessor: null)
@@ -31,8 +30,13 @@ public HttpContextFactory(ObjectPoolProvider poolProvider, IOptions<FormOptions>
3130
throw new ArgumentNullException(nameof(formOptions));
3231
}
3332

34-
_builderPool = poolProvider.CreateStringBuilderPool();
35-
_formOptions = formOptions.Value;
33+
34+
var options = formOptions.Value;
35+
var builderPool = poolProvider.CreateStringBuilderPool();
36+
37+
_responseCookiesFeatureFactory = features => new ResponseCookiesFeature(features, builderPool);
38+
_formFeatureFactory = request => new FormFeature(request, options);
39+
3640
_httpContextAccessor = httpContextAccessor;
3741
}
3842

@@ -43,7 +47,7 @@ public HttpContext Create(IFeatureCollection featureCollection)
4347
throw new ArgumentNullException(nameof(featureCollection));
4448
}
4549

46-
var httpContext = new DefaultHttpContext(featureCollection, _builderPool, _formOptions);
50+
var httpContext = new DefaultHttpContext(featureCollection, _responseCookiesFeatureFactory, _formFeatureFactory);
4751
if (_httpContextAccessor != null)
4852
{
4953
_httpContextAccessor.HttpContext = httpContext;

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,22 @@ namespace Microsoft.AspNetCore.Http.Internal
1212
{
1313
public class DefaultHttpRequest : HttpRequest
1414
{
15+
private static readonly Func<HttpRequest, FormFeature> _defaultFormFeatureFactory
16+
= request => new FormFeature(request);
17+
18+
private readonly Func<HttpRequest, FormFeature> _formFeatureFactory;
19+
1520
private HttpContext _context;
1621
private FeatureReferences<FeatureInterfaces> _features;
1722

1823
public DefaultHttpRequest(HttpContext context)
24+
: this(context, _defaultFormFeatureFactory)
25+
{
26+
}
27+
28+
public DefaultHttpRequest(HttpContext context, Func<HttpRequest, FormFeature> formFeatureFactory)
1929
{
30+
_formFeatureFactory = formFeatureFactory ?? _defaultFormFeatureFactory;
2031
Initialize(context);
2132
}
2233

@@ -41,7 +52,7 @@ public virtual void Uninitialize()
4152
_features.Fetch(ref _features.Cache.Query, f => new QueryFeature(f));
4253

4354
private IFormFeature FormFeature =>
44-
_features.Fetch(ref _features.Cache.Form, this, f => new FormFeature(f, (f._context as DefaultHttpContext)?.FormOptions));
55+
_features.Fetch(ref _features.Cache.Form, this, request => _formFeatureFactory(request));
4556

4657
private IRequestCookiesFeature RequestCookiesFeature =>
4758
_features.Fetch(ref _features.Cache.Cookies, f => new RequestCookiesFeature(f));

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,22 @@ namespace Microsoft.AspNetCore.Http.Internal
1111
{
1212
public class DefaultHttpResponse : HttpResponse
1313
{
14+
private static readonly Func<IFeatureCollection, ResponseCookiesFeature> _defaultResponseCookiesFeatureFactory
15+
= features => new ResponseCookiesFeature(features);
16+
17+
private readonly Func<IFeatureCollection, ResponseCookiesFeature> _responseCookiesFeatureFactory;
18+
1419
private HttpContext _context;
1520
private FeatureReferences<FeatureInterfaces> _features;
1621

1722
public DefaultHttpResponse(HttpContext context)
23+
: this(context, null)
24+
{
25+
}
26+
27+
public DefaultHttpResponse(HttpContext context, Func<IFeatureCollection, ResponseCookiesFeature> responseCookiesFeatureFactory)
1828
{
29+
_responseCookiesFeatureFactory = responseCookiesFeatureFactory ?? _defaultResponseCookiesFeatureFactory;
1930
Initialize(context);
2031
}
2132

@@ -35,7 +46,7 @@ public virtual void Uninitialize()
3546
_features.Fetch(ref _features.Cache.Response, f => null);
3647

3748
private IResponseCookiesFeature ResponseCookiesFeature =>
38-
_features.Fetch(ref _features.Cache.Cookies, this, f => new ResponseCookiesFeature(f._context.Features, (f._context as DefaultHttpContext)?.BuilderPool));
49+
_features.Fetch(ref _features.Cache.Cookies, _context.Features, features => _responseCookiesFeatureFactory(features));
3950

4051

4152
public override HttpContext HttpContext { get { return _context; } }

0 commit comments

Comments
 (0)