Lazy translate conditional Owin keys to Features.
This commit is contained in:
parent
850128dc39
commit
40a7181ff0
|
|
@ -31,8 +31,7 @@ namespace Owin
|
||||||
return app.Invoke(
|
return app.Invoke(
|
||||||
new DefaultHttpContext(
|
new DefaultHttpContext(
|
||||||
new FeatureCollection(
|
new FeatureCollection(
|
||||||
new FeatureObject(
|
new OwinHttpEnvironment(env))));
|
||||||
new OwinHttpEnvironment(env)))));
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return appBuilder.Use(middleware1);
|
return appBuilder.Use(middleware1);
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@
|
||||||
internal static class CommonKeys
|
internal static class CommonKeys
|
||||||
{
|
{
|
||||||
public const string ClientCertificate = "ssl.ClientCertificate";
|
public const string ClientCertificate = "ssl.ClientCertificate";
|
||||||
|
public const string LoadClientCertAsync = "ssl.LoadClientCertAsync";
|
||||||
public const string RemoteIpAddress = "server.RemoteIpAddress";
|
public const string RemoteIpAddress = "server.RemoteIpAddress";
|
||||||
public const string RemotePort = "server.RemotePort";
|
public const string RemotePort = "server.RemotePort";
|
||||||
public const string LocalIpAddress = "server.LocalIpAddress";
|
public const string LocalIpAddress = "server.LocalIpAddress";
|
||||||
|
|
|
||||||
|
|
@ -2,17 +2,23 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
#if NET45
|
#if NET45
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
#endif
|
#endif
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNet.HttpFeature;
|
using Microsoft.AspNet.HttpFeature;
|
||||||
|
using Microsoft.AspNet.FeatureModel;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.PipelineCore.Owin
|
namespace Microsoft.AspNet.PipelineCore.Owin
|
||||||
{
|
{
|
||||||
|
using SendFileFunc = Func<string, long, long?, CancellationToken, Task>;
|
||||||
|
|
||||||
public class OwinHttpEnvironment :
|
public class OwinHttpEnvironment :
|
||||||
|
IFeatureCollection,
|
||||||
IHttpRequestInformation,
|
IHttpRequestInformation,
|
||||||
IHttpResponseInformation,
|
IHttpResponseInformation,
|
||||||
IHttpConnection,
|
IHttpConnection,
|
||||||
|
|
@ -149,9 +155,40 @@ namespace Microsoft.AspNet.PipelineCore.Owin
|
||||||
set { Prop(OwinConstants.CommonKeys.LocalPort, value); }
|
set { Prop(OwinConstants.CommonKeys.LocalPort, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool SupportsSendFile
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
object obj;
|
||||||
|
return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation)
|
Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
object obj;
|
||||||
|
if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj))
|
||||||
|
{
|
||||||
|
SendFileFunc func = (SendFileFunc)obj;
|
||||||
|
return func(path, offset, length, cancellation);
|
||||||
|
}
|
||||||
|
throw new NotSupportedException(OwinConstants.SendFiles.SendAsync);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool SupportsClientCerts
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
object obj;
|
||||||
|
if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase)
|
||||||
|
&& (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj)
|
||||||
|
|| Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj))
|
||||||
|
&& obj != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#if NET45
|
#if NET45
|
||||||
X509Certificate IHttpTransportLayerSecurity.ClientCertificate
|
X509Certificate IHttpTransportLayerSecurity.ClientCertificate
|
||||||
|
|
@ -164,5 +201,146 @@ namespace Microsoft.AspNet.PipelineCore.Owin
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Revision
|
||||||
|
{
|
||||||
|
get { return 0; } // Not modifiable
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(Type key, object value)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsKey(Type key)
|
||||||
|
{
|
||||||
|
// Does this type implement the requested interface?
|
||||||
|
if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo()))
|
||||||
|
{
|
||||||
|
// Check for conditional features
|
||||||
|
if (key == typeof(IHttpSendFile))
|
||||||
|
{
|
||||||
|
return SupportsSendFile;
|
||||||
|
}
|
||||||
|
else if (key == typeof(IHttpTransportLayerSecurity))
|
||||||
|
{
|
||||||
|
return SupportsClientCerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The rest of the features are always supported.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<Type> Keys
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
IList<Type> keys = new List<Type>()
|
||||||
|
{
|
||||||
|
typeof(IHttpRequestInformation),
|
||||||
|
typeof(IHttpResponseInformation),
|
||||||
|
typeof(IHttpConnection),
|
||||||
|
typeof(ICanHasOwinEnvironment),
|
||||||
|
};
|
||||||
|
if (SupportsSendFile)
|
||||||
|
{
|
||||||
|
keys.Add(typeof(IHttpSendFile));
|
||||||
|
}
|
||||||
|
if (SupportsClientCerts)
|
||||||
|
{
|
||||||
|
keys.Add(typeof(IHttpTransportLayerSecurity));
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(Type key)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryGetValue(Type key, out object value)
|
||||||
|
{
|
||||||
|
if (ContainsKey(key))
|
||||||
|
{
|
||||||
|
value = this;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
value = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<object> Values
|
||||||
|
{
|
||||||
|
get { throw new NotSupportedException(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public object this[Type key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
object value;
|
||||||
|
if (TryGetValue(key, out value))
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
throw new KeyNotFoundException(key.FullName);
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(KeyValuePair<Type, object> item)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(KeyValuePair<Type, object> item)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(KeyValuePair<Type, object>[] array, int arrayIndex)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get { return Keys.Count; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsReadOnly
|
||||||
|
{
|
||||||
|
get { return true; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(KeyValuePair<Type, object> item)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<Type, object>> GetEnumerator()
|
||||||
|
{
|
||||||
|
return Keys.Select(type => new KeyValuePair<Type, object>(type, this[type])).GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue