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

[Proposal] Move RequestIdentifierFeature to HttpContext #435

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ public abstract class HttpContext : IDisposable

public abstract ISession Session { get; set; }

public abstract string TraceIdentifier { get; set; }

public abstract void Abort();

public abstract void Dispose();
Expand Down
38 changes: 0 additions & 38 deletions src/Microsoft.AspNet.Http.Features/FeatureReference.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,44 @@

namespace Microsoft.AspNet.Http.Authentication.Internal
{
public class DefaultAuthenticationManager : AuthenticationManager
public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache
{
private readonly IFeatureCollection _features;
private FeatureReference<IHttpAuthenticationFeature> _authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
private FeatureReference<IHttpResponseFeature> _response = FeatureReference<IHttpResponseFeature>.Default;
private int _cachedFeaturesRevision = -1;

private IHttpAuthenticationFeature _authentication;
private IHttpResponseFeature _response;

public DefaultAuthenticationManager(IFeatureCollection features)
{
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_authentication = null;
_response = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpAuthenticationFeature HttpAuthenticationFeature
{
get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpAuthenticationFeature(),
ref _authentication);
}
}

private IHttpResponseFeature HttpResponseFeature
{
get { return _response.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _response); }
}

public override IEnumerable<AuthenticationDescription> GetAuthenticationSchemes()
Expand Down
35 changes: 30 additions & 5 deletions src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,51 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultConnectionInfo : ConnectionInfo
public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache
{
private readonly IFeatureCollection _features;
private int _cachedFeaturesRevision = -1;

private FeatureReference<IHttpConnectionFeature> _connection = FeatureReference<IHttpConnectionFeature>.Default;
private FeatureReference<ITlsConnectionFeature> _tlsConnection = FeatureReference<ITlsConnectionFeature>.Default;
private IHttpConnectionFeature _connection;
private ITlsConnectionFeature _tlsConnection;

public DefaultConnectionInfo(IFeatureCollection features)
{
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_connection = null;
_tlsConnection = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpConnectionFeature HttpConnectionFeature
{
get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpConnectionFeature(),
ref _connection);
}
}

private ITlsConnectionFeature TlsConnectionFeature
{
get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new TlsConnectionFeature(),
ref _tlsConnection);
}
}

public override IPAddress RemoteIpAddress
Expand Down
95 changes: 78 additions & 17 deletions src/Microsoft.AspNet.Http/DefaultHttpContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,22 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultHttpContext : HttpContext
public class DefaultHttpContext : HttpContext, IFeatureCache
{
private readonly HttpRequest _request;
private readonly HttpResponse _response;
private readonly ConnectionInfo _connection;
private readonly AuthenticationManager _authenticationManager;

private FeatureReference<IItemsFeature> _items;
private FeatureReference<IServiceProvidersFeature> _serviceProviders;
private FeatureReference<IHttpAuthenticationFeature> _authentication;
private FeatureReference<IHttpRequestLifetimeFeature> _lifetime;
private FeatureReference<ISessionFeature> _session;
private IItemsFeature _items;
private IServiceProvidersFeature _serviceProviders;
private IHttpAuthenticationFeature _authentication;
private IHttpRequestLifetimeFeature _lifetime;
private ISessionFeature _session;
private WebSocketManager _websockets;

private IFeatureCollection _features;
private int _cachedFeaturesRevision = -1;

public DefaultHttpContext()
: this(new FeatureCollection())
Expand All @@ -43,37 +45,90 @@ public DefaultHttpContext(IFeatureCollection features)
_response = new DefaultHttpResponse(this, features);
_connection = new DefaultConnectionInfo(features);
_authenticationManager = new DefaultAuthenticationManager(features);
}

_items = FeatureReference<IItemsFeature>.Default;
_serviceProviders = FeatureReference<IServiceProvidersFeature>.Default;
_authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
_lifetime = FeatureReference<IHttpRequestLifetimeFeature>.Default;
_session = FeatureReference<ISessionFeature>.Default;
void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision !=_features.Revision)
{
_items = null;
_serviceProviders = null;
_authentication = null;
_lifetime = null;
_session = null;
_cachedFeaturesRevision = _features.Revision;
}
}

IItemsFeature ItemsFeature
{
get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new ItemsFeature(),
ref _items);
}
}

IServiceProvidersFeature ServiceProvidersFeature
{
get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new ServiceProvidersFeature(),
ref _serviceProviders);
}
}

private IHttpAuthenticationFeature HttpAuthenticationFeature
{
get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpAuthenticationFeature(),
ref _authentication);
}
}

private IHttpRequestLifetimeFeature LifetimeFeature
{
get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpRequestLifetimeFeature(),
ref _lifetime);
}
}

private ISessionFeature SessionFeature
{
get { return _session.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _session); }
set
{
_features.Set(value);
_session = value;
}
}
private IHttpRequestIdentifierFeature RequestIdentifierFeature
{
get {
return FeatureHelpers.GetOrCreate<IHttpRequestIdentifierFeature>(
this,
_features,
() => new HttpRequestIdentifierFeature());
}
set
{
_features.Set(value);
}
}

public override IFeatureCollection Features { get { return _features; } }
Expand Down Expand Up @@ -125,6 +180,12 @@ public override CancellationToken RequestAborted
set { LifetimeFeature.RequestAborted = value; }
}

public override string TraceIdentifier
{
get { return RequestIdentifierFeature.TraceIdentifier; }
set { RequestIdentifierFeature.TraceIdentifier = value; }
}

public override ISession Session
{
get
Expand All @@ -143,7 +204,7 @@ public override ISession Session
if (feature == null)
{
feature = new DefaultSessionFeature();
_session.Update(_features, feature);
SessionFeature = feature;
}
feature.Session = value;
}
Expand Down
53 changes: 44 additions & 9 deletions src/Microsoft.AspNet.Http/DefaultHttpRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,75 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultHttpRequest : HttpRequest
public class DefaultHttpRequest : HttpRequest, IFeatureCache
{
private readonly DefaultHttpContext _context;
private readonly IFeatureCollection _features;
private int _cachedFeaturesRevision = -1;

private FeatureReference<IHttpRequestFeature> _request = FeatureReference<IHttpRequestFeature>.Default;
private FeatureReference<IQueryFeature> _query = FeatureReference<IQueryFeature>.Default;
private FeatureReference<IFormFeature> _form = FeatureReference<IFormFeature>.Default;
private FeatureReference<IRequestCookiesFeature> _cookies = FeatureReference<IRequestCookiesFeature>.Default;
private IHttpRequestFeature _request;
private IQueryFeature _query;
private IFormFeature _form;
private IRequestCookiesFeature _cookies;

public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features)
{
_context = context;
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_request = null;
_query = null;
_form = null;
_cookies = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpRequestFeature HttpRequestFeature
{
get { return _request.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _request); }
}

private IQueryFeature QueryFeature
{
get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
(f) => new QueryFeature(f),
ref _query);
}
}

private IFormFeature FormFeature
{
get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
this,
(r) => new FormFeature(r),
ref _form);
}
}

private IRequestCookiesFeature RequestCookiesFeature
{
get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
(f) => new RequestCookiesFeature(f),
ref _cookies);
}
}

public override HttpContext HttpContext { get { return _context; } }
Expand Down
Loading