This commit is contained in:
parent
cc1a24b949
commit
0ed2692ef4
|
|
@ -3,10 +3,8 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.WebSockets;
|
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNet.Http.Authentication;
|
using Microsoft.AspNet.Http.Authentication;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Http
|
namespace Microsoft.AspNet.Http
|
||||||
|
|
@ -33,9 +31,7 @@ namespace Microsoft.AspNet.Http
|
||||||
|
|
||||||
public abstract ISessionCollection Session { get; }
|
public abstract ISessionCollection Session { get; }
|
||||||
|
|
||||||
public abstract bool IsWebSocketRequest { get; }
|
public abstract WebSocketManager WebSockets { get; }
|
||||||
|
|
||||||
public abstract IList<string> WebSocketRequestedProtocols { get; }
|
|
||||||
|
|
||||||
public abstract void Abort();
|
public abstract void Abort();
|
||||||
|
|
||||||
|
|
@ -54,12 +50,5 @@ namespace Microsoft.AspNet.Http
|
||||||
{
|
{
|
||||||
SetFeature(typeof(T), instance);
|
SetFeature(typeof(T), instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual Task<WebSocket> AcceptWebSocketAsync()
|
|
||||||
{
|
|
||||||
return AcceptWebSocketAsync(subProtocol: null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract Task<WebSocket> AcceptWebSocketAsync(string subProtocol);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net.WebSockets;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Http
|
||||||
|
{
|
||||||
|
public abstract class WebSocketManager
|
||||||
|
{
|
||||||
|
public abstract bool IsWebSocketRequest { get; }
|
||||||
|
|
||||||
|
public abstract IList<string> WebSocketRequestedProtocols { get; }
|
||||||
|
|
||||||
|
public virtual Task<WebSocket> AcceptWebSocketAsync()
|
||||||
|
{
|
||||||
|
return AcceptWebSocketAsync(subProtocol: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract Task<WebSocket> AcceptWebSocketAsync(string subProtocol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,6 @@ namespace Microsoft.AspNet.Http
|
||||||
{
|
{
|
||||||
bool IsWebSocketRequest { get; }
|
bool IsWebSocketRequest { get; }
|
||||||
|
|
||||||
Task<WebSocket> AcceptAsync(IWebSocketAcceptContext context);
|
Task<WebSocket> AcceptAsync(WebSocketAcceptContext context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Http
|
|
||||||
{
|
|
||||||
public interface IWebSocketAcceptContext
|
|
||||||
{
|
|
||||||
string SubProtocol { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Http
|
namespace Microsoft.AspNet.Http
|
||||||
{
|
{
|
||||||
public class WebSocketAcceptContext : IWebSocketAcceptContext
|
public class WebSocketAcceptContext
|
||||||
{
|
{
|
||||||
public virtual string SubProtocol { get; set; }
|
public virtual string SubProtocol { get; set; }
|
||||||
}
|
}
|
||||||
|
|
@ -3,22 +3,17 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.WebSockets;
|
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNet.FeatureModel;
|
using Microsoft.AspNet.FeatureModel;
|
||||||
using Microsoft.AspNet.Http.Authentication;
|
using Microsoft.AspNet.Http.Authentication;
|
||||||
using Microsoft.AspNet.Http.Collections;
|
using Microsoft.AspNet.Http.Collections;
|
||||||
using Microsoft.AspNet.Http.Infrastructure;
|
using Microsoft.AspNet.Http.Infrastructure;
|
||||||
using Microsoft.Net.Http.Headers;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Http
|
namespace Microsoft.AspNet.Http
|
||||||
{
|
{
|
||||||
public class DefaultHttpContext : HttpContext
|
public class DefaultHttpContext : HttpContext
|
||||||
{
|
{
|
||||||
private static IList<string> EmptyList = new List<string>();
|
|
||||||
|
|
||||||
private readonly HttpRequest _request;
|
private readonly HttpRequest _request;
|
||||||
private readonly HttpResponse _response;
|
private readonly HttpResponse _response;
|
||||||
private readonly ConnectionInfo _connection;
|
private readonly ConnectionInfo _connection;
|
||||||
|
|
@ -28,8 +23,8 @@ namespace Microsoft.AspNet.Http
|
||||||
private FeatureReference<IServiceProvidersFeature> _serviceProviders;
|
private FeatureReference<IServiceProvidersFeature> _serviceProviders;
|
||||||
private FeatureReference<IHttpAuthenticationFeature> _authentication;
|
private FeatureReference<IHttpAuthenticationFeature> _authentication;
|
||||||
private FeatureReference<IHttpRequestLifetimeFeature> _lifetime;
|
private FeatureReference<IHttpRequestLifetimeFeature> _lifetime;
|
||||||
private FeatureReference<IHttpWebSocketFeature> _webSockets;
|
|
||||||
private FeatureReference<ISessionFeature> _session;
|
private FeatureReference<ISessionFeature> _session;
|
||||||
|
private WebSocketManager _websockets;
|
||||||
private IFeatureCollection _features;
|
private IFeatureCollection _features;
|
||||||
|
|
||||||
public DefaultHttpContext()
|
public DefaultHttpContext()
|
||||||
|
|
@ -51,7 +46,6 @@ namespace Microsoft.AspNet.Http
|
||||||
_serviceProviders = FeatureReference<IServiceProvidersFeature>.Default;
|
_serviceProviders = FeatureReference<IServiceProvidersFeature>.Default;
|
||||||
_authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
|
_authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
|
||||||
_lifetime = FeatureReference<IHttpRequestLifetimeFeature>.Default;
|
_lifetime = FeatureReference<IHttpRequestLifetimeFeature>.Default;
|
||||||
_webSockets = FeatureReference<IHttpWebSocketFeature>.Default;
|
|
||||||
_session = FeatureReference<ISessionFeature>.Default;
|
_session = FeatureReference<ISessionFeature>.Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,11 +69,6 @@ namespace Microsoft.AspNet.Http
|
||||||
get { return _lifetime.Fetch(_features); }
|
get { return _lifetime.Fetch(_features); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private IHttpWebSocketFeature WebSocketFeature
|
|
||||||
{
|
|
||||||
get { return _webSockets.Fetch(_features); }
|
|
||||||
}
|
|
||||||
|
|
||||||
private ISessionFeature SessionFeature
|
private ISessionFeature SessionFeature
|
||||||
{
|
{
|
||||||
get { return _session.Fetch(_features); }
|
get { return _session.Fetch(_features); }
|
||||||
|
|
@ -161,20 +150,15 @@ namespace Microsoft.AspNet.Http
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsWebSocketRequest
|
public override WebSocketManager WebSockets
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var webSocketFeature = WebSocketFeature;
|
if (_websockets == null)
|
||||||
return webSocketFeature != null && webSocketFeature.IsWebSocketRequest;
|
{
|
||||||
}
|
_websockets = new DefaultWebSocketManager(_features);
|
||||||
}
|
}
|
||||||
|
return _websockets;
|
||||||
public override IList<string> WebSocketRequestedProtocols
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Request.Headers.GetValues(HeaderNames.WebSocketSubProtocols) ?? EmptyList;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -203,15 +187,5 @@ namespace Microsoft.AspNet.Http
|
||||||
{
|
{
|
||||||
_features[type] = instance;
|
_features[type] = instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task<WebSocket> AcceptWebSocketAsync(string subProtocol)
|
|
||||||
{
|
|
||||||
var webSocketFeature = WebSocketFeature;
|
|
||||||
if (WebSocketFeature == null)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException("WebSockets are not supported");
|
|
||||||
}
|
|
||||||
return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net.WebSockets;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNet.FeatureModel;
|
||||||
|
using Microsoft.AspNet.Http.Infrastructure;
|
||||||
|
using Microsoft.Net.Http.Headers;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Http
|
||||||
|
{
|
||||||
|
public class DefaultWebSocketManager : WebSocketManager
|
||||||
|
{
|
||||||
|
private static IList<string> EmptyList = new List<string>();
|
||||||
|
|
||||||
|
private IFeatureCollection _features;
|
||||||
|
private FeatureReference<IHttpRequestFeature> _request = FeatureReference<IHttpRequestFeature>.Default;
|
||||||
|
private FeatureReference<IHttpWebSocketFeature> _webSockets = FeatureReference<IHttpWebSocketFeature>.Default;
|
||||||
|
|
||||||
|
public DefaultWebSocketManager(IFeatureCollection features)
|
||||||
|
{
|
||||||
|
_features = features;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IHttpRequestFeature HttpRequestFeature
|
||||||
|
{
|
||||||
|
get { return _request.Fetch(_features); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private IHttpWebSocketFeature WebSocketFeature
|
||||||
|
{
|
||||||
|
get { return _webSockets.Fetch(_features); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsWebSocketRequest
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return WebSocketFeature != null && WebSocketFeature.IsWebSocketRequest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IList<string> WebSocketRequestedProtocols
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return ParsingHelpers.GetHeaderUnmodified(HttpRequestFeature.Headers,
|
||||||
|
HeaderNames.WebSocketSubProtocols) ?? EmptyList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<WebSocket> AcceptWebSocketAsync(string subProtocol)
|
||||||
|
{
|
||||||
|
if (WebSocketFeature == null)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException("WebSockets are not supported");
|
||||||
|
}
|
||||||
|
return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Owin
|
||||||
using WebSocketAcceptAlt =
|
using WebSocketAcceptAlt =
|
||||||
Func
|
Func
|
||||||
<
|
<
|
||||||
IWebSocketAcceptContext, // WebSocket Accept parameters
|
WebSocketAcceptContext, // WebSocket Accept parameters
|
||||||
Task<WebSocket>
|
Task<WebSocket>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Owin
|
||||||
feature => new Func<Task>(() => feature.GetClientCertificateAsync(CancellationToken.None))));
|
feature => new Func<Task>(() => feature.GetClientCertificateAsync(CancellationToken.None))));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (context.IsWebSocketRequest)
|
if (context.WebSockets.IsWebSocketRequest)
|
||||||
{
|
{
|
||||||
_entries.Add(OwinConstants.WebSocket.AcceptAlt, new FeatureMap<IHttpWebSocketFeature>(feature => new WebSocketAcceptAlt(feature.AcceptAsync)));
|
_entries.Add(OwinConstants.WebSocket.AcceptAlt, new FeatureMap<IHttpWebSocketFeature>(feature => new WebSocketAcceptAlt(feature.AcceptAsync)));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -277,14 +277,14 @@ namespace Microsoft.AspNet.Owin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Task<WebSocket> IHttpWebSocketFeature.AcceptAsync(IWebSocketAcceptContext context)
|
Task<WebSocket> IHttpWebSocketFeature.AcceptAsync(WebSocketAcceptContext context)
|
||||||
{
|
{
|
||||||
object obj;
|
object obj;
|
||||||
if (!Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj))
|
if (!Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj))
|
||||||
{
|
{
|
||||||
throw new NotSupportedException("WebSockets are not supported"); // TODO: LOC
|
throw new NotSupportedException("WebSockets are not supported"); // TODO: LOC
|
||||||
}
|
}
|
||||||
var accept = (Func<IWebSocketAcceptContext, Task<WebSocket>>)obj;
|
var accept = (Func<WebSocketAcceptContext, Task<WebSocket>>)obj;
|
||||||
return accept(context);
|
return accept(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Owin
|
||||||
using WebSocketAcceptAlt =
|
using WebSocketAcceptAlt =
|
||||||
Func
|
Func
|
||||||
<
|
<
|
||||||
IWebSocketAcceptContext, // WebSocket Accept parameters
|
WebSocketAcceptContext, // WebSocket Accept parameters
|
||||||
Task<WebSocket>
|
Task<WebSocket>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Owin
|
||||||
private Task UpstreamTask { get; set; }
|
private Task UpstreamTask { get; set; }
|
||||||
private TaskCompletionSource<int> UpstreamWentAsyncTcs { get { return _upstreamWentAsync; } }
|
private TaskCompletionSource<int> UpstreamWentAsyncTcs { get { return _upstreamWentAsync; } }
|
||||||
|
|
||||||
private async Task<WebSocket> AcceptWebSocketAsync(IWebSocketAcceptContext context)
|
private async Task<WebSocket> AcceptWebSocketAsync(WebSocketAcceptContext context)
|
||||||
{
|
{
|
||||||
IDictionary<string, object> options = null;
|
IDictionary<string, object> options = null;
|
||||||
if (context is OwinWebSocketAcceptContext)
|
if (context is OwinWebSocketAcceptContext)
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ using Microsoft.AspNet.Http;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Owin
|
namespace Microsoft.AspNet.Owin
|
||||||
{
|
{
|
||||||
public class OwinWebSocketAcceptContext : IWebSocketAcceptContext
|
public class OwinWebSocketAcceptContext : WebSocketAcceptContext
|
||||||
{
|
{
|
||||||
private IDictionary<string, object> _options;
|
private IDictionary<string, object> _options;
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Owin
|
||||||
_options = options;
|
_options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string SubProtocol
|
public override string SubProtocol
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Owin
|
||||||
using WebSocketAcceptAlt =
|
using WebSocketAcceptAlt =
|
||||||
Func
|
Func
|
||||||
<
|
<
|
||||||
IWebSocketAcceptContext, // WebSocket Accept parameters
|
WebSocketAcceptContext, // WebSocket Accept parameters
|
||||||
Task<WebSocket>
|
Task<WebSocket>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
|
@ -65,11 +65,11 @@ namespace Microsoft.AspNet.Owin
|
||||||
await next(environment);
|
await next(environment);
|
||||||
if ((int)environment[OwinConstants.ResponseStatusCode] == 101 && adapter._callback != null)
|
if ((int)environment[OwinConstants.ResponseStatusCode] == 101 && adapter._callback != null)
|
||||||
{
|
{
|
||||||
IWebSocketAcceptContext acceptContext = null;
|
WebSocketAcceptContext acceptContext = null;
|
||||||
object obj;
|
object obj;
|
||||||
if (adapter._options != null && adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj))
|
if (adapter._options != null && adapter._options.TryGetValue(typeof(WebSocketAcceptContext).FullName, out obj))
|
||||||
{
|
{
|
||||||
acceptContext = obj as IWebSocketAcceptContext;
|
acceptContext = obj as WebSocketAcceptContext;
|
||||||
}
|
}
|
||||||
else if (adapter._options != null)
|
else if (adapter._options != null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue