diff options
Diffstat (limited to 'SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs')
| -rw-r--r-- | SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs | 358 |
1 files changed, 54 insertions, 304 deletions
diff --git a/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs b/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs index 803c67b83..49375678d 100644 --- a/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs +++ b/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs @@ -12,337 +12,87 @@ using SocketHttpListener.Primitives; namespace SocketHttpListener.Net.WebSockets { - /// <summary> - /// Provides the properties used to access the information in a WebSocket connection request - /// received by the <see cref="HttpListener"/>. - /// </summary> - /// <remarks> - /// </remarks> public class HttpListenerWebSocketContext : WebSocketContext { - #region Private Fields + private readonly Uri _requestUri; + private readonly QueryParamCollection _headers; + private readonly CookieCollection _cookieCollection; + private readonly IPrincipal _user; + private readonly bool _isAuthenticated; + private readonly bool _isLocal; + private readonly bool _isSecureConnection; - private HttpListenerContext _context; - private WebSocket _websocket; + private readonly string _origin; + private readonly IEnumerable<string> _secWebSocketProtocols; + private readonly string _secWebSocketVersion; + private readonly string _secWebSocketKey; - #endregion - - #region Internal Constructors + private readonly WebSocket _webSocket; internal HttpListenerWebSocketContext( - HttpListenerContext context, string protocol, ICryptoProvider cryptoProvider, IMemoryStreamFactory memoryStreamFactory) + Uri requestUri, + QueryParamCollection headers, + CookieCollection cookieCollection, + IPrincipal user, + bool isAuthenticated, + bool isLocal, + bool isSecureConnection, + string origin, + IEnumerable<string> secWebSocketProtocols, + string secWebSocketVersion, + string secWebSocketKey, + WebSocket webSocket) { - _context = context; - _websocket = new WebSocket(this, protocol, cryptoProvider, memoryStreamFactory); - } - - #endregion + _cookieCollection = new CookieCollection(); + _cookieCollection.Add(cookieCollection); - #region Internal Properties + //_headers = new NameValueCollection(headers); + _headers = headers; + _user = CopyPrincipal(user); - internal Stream Stream - { - get - { - return _context.Connection.Stream; - } + _requestUri = requestUri; + _isAuthenticated = isAuthenticated; + _isLocal = isLocal; + _isSecureConnection = isSecureConnection; + _origin = origin; + _secWebSocketProtocols = secWebSocketProtocols; + _secWebSocketVersion = secWebSocketVersion; + _secWebSocketKey = secWebSocketKey; + _webSocket = webSocket; } - #endregion + public override Uri RequestUri => _requestUri; - #region Public Properties + public override QueryParamCollection Headers => _headers; - /// <summary> - /// Gets the HTTP cookies included in the request. - /// </summary> - /// <value> - /// A <see cref="System.Net.CookieCollection"/> that contains the cookies. - /// </value> - public override CookieCollection CookieCollection - { - get - { - return _context.Request.Cookies; - } - } + public override string Origin => _origin; - /// <summary> - /// Gets the HTTP headers included in the request. - /// </summary> - /// <value> - /// A <see cref="QueryParamCollection"/> that contains the headers. - /// </value> - public override QueryParamCollection Headers - { - get - { - return _context.Request.Headers; - } - } + public override IEnumerable<string> SecWebSocketProtocols => _secWebSocketProtocols; - /// <summary> - /// Gets the value of the Host header included in the request. - /// </summary> - /// <value> - /// A <see cref="string"/> that represents the value of the Host header. - /// </value> - public override string Host - { - get - { - return _context.Request.Headers["Host"]; - } - } + public override string SecWebSocketVersion => _secWebSocketVersion; - /// <summary> - /// Gets a value indicating whether the client is authenticated. - /// </summary> - /// <value> - /// <c>true</c> if the client is authenticated; otherwise, <c>false</c>. - /// </value> - public override bool IsAuthenticated - { - get - { - return _context.Request.IsAuthenticated; - } - } + public override string SecWebSocketKey => _secWebSocketKey; - /// <summary> - /// Gets a value indicating whether the client connected from the local computer. - /// </summary> - /// <value> - /// <c>true</c> if the client connected from the local computer; otherwise, <c>false</c>. - /// </value> - public override bool IsLocal - { - get - { - return _context.Request.IsLocal; - } - } + public override CookieCollection CookieCollection => _cookieCollection; - /// <summary> - /// Gets a value indicating whether the WebSocket connection is secured. - /// </summary> - /// <value> - /// <c>true</c> if the connection is secured; otherwise, <c>false</c>. - /// </value> - public override bool IsSecureConnection - { - get - { - return _context.Connection.IsSecure; - } - } + public override IPrincipal User => _user; - /// <summary> - /// Gets a value indicating whether the request is a WebSocket connection request. - /// </summary> - /// <value> - /// <c>true</c> if the request is a WebSocket connection request; otherwise, <c>false</c>. - /// </value> - public override bool IsWebSocketRequest - { - get - { - return _context.Request.IsWebSocketRequest; - } - } + public override bool IsAuthenticated => _isAuthenticated; - /// <summary> - /// Gets the value of the Origin header included in the request. - /// </summary> - /// <value> - /// A <see cref="string"/> that represents the value of the Origin header. - /// </value> - public override string Origin - { - get - { - return _context.Request.Headers["Origin"]; - } - } + public override bool IsLocal => _isLocal; - /// <summary> - /// Gets the query string included in the request. - /// </summary> - /// <value> - /// A <see cref="QueryParamCollection"/> that contains the query string parameters. - /// </value> - public override QueryParamCollection QueryString - { - get - { - return _context.Request.QueryString; - } - } + public override bool IsSecureConnection => _isSecureConnection; - /// <summary> - /// Gets the URI requested by the client. - /// </summary> - /// <value> - /// A <see cref="Uri"/> that represents the requested URI. - /// </value> - public override Uri RequestUri - { - get - { - return _context.Request.Url; - } - } + public override WebSocket WebSocket => _webSocket; - /// <summary> - /// Gets the value of the Sec-WebSocket-Key header included in the request. - /// </summary> - /// <remarks> - /// This property provides a part of the information used by the server to prove that it - /// received a valid WebSocket connection request. - /// </remarks> - /// <value> - /// A <see cref="string"/> that represents the value of the Sec-WebSocket-Key header. - /// </value> - public override string SecWebSocketKey + private static IPrincipal CopyPrincipal(IPrincipal user) { - get + if (user != null) { - return _context.Request.Headers["Sec-WebSocket-Key"]; + throw new NotImplementedException(); } - } - /// <summary> - /// Gets the values of the Sec-WebSocket-Protocol header included in the request. - /// </summary> - /// <remarks> - /// This property represents the subprotocols requested by the client. - /// </remarks> - /// <value> - /// An <see cref="T:System.Collections.Generic.IEnumerable{string}"/> instance that provides - /// an enumerator which supports the iteration over the values of the Sec-WebSocket-Protocol - /// header. - /// </value> - public override IEnumerable<string> SecWebSocketProtocols - { - get - { - var protocols = _context.Request.Headers["Sec-WebSocket-Protocol"]; - if (protocols != null) - foreach (var protocol in protocols.Split(',')) - yield return protocol.Trim(); - } - } - - /// <summary> - /// Gets the value of the Sec-WebSocket-Version header included in the request. - /// </summary> - /// <remarks> - /// This property represents the WebSocket protocol version. - /// </remarks> - /// <value> - /// A <see cref="string"/> that represents the value of the Sec-WebSocket-Version header. - /// </value> - public override string SecWebSocketVersion - { - get - { - return _context.Request.Headers["Sec-WebSocket-Version"]; - } - } - - /// <summary> - /// Gets the server endpoint as an IP address and a port number. - /// </summary> - /// <value> - /// </value> - public override IPEndPoint ServerEndPoint - { - get - { - return _context.Connection.LocalEndPoint; - } - } - - /// <summary> - /// Gets the client information (identity, authentication, and security roles). - /// </summary> - /// <value> - /// A <see cref="IPrincipal"/> that represents the client information. - /// </value> - public override IPrincipal User - { - get - { - return _context.User; - } - } - - /// <summary> - /// Gets the client endpoint as an IP address and a port number. - /// </summary> - /// <value> - /// </value> - public override IPEndPoint UserEndPoint - { - get - { - return _context.Connection.RemoteEndPoint; - } + return null; } - - /// <summary> - /// Gets the <see cref="SocketHttpListener.WebSocket"/> instance used for two-way communication - /// between client and server. - /// </summary> - /// <value> - /// A <see cref="SocketHttpListener.WebSocket"/>. - /// </value> - public override WebSocket WebSocket - { - get - { - return _websocket; - } - } - - #endregion - - #region Internal Methods - - internal void Close() - { - try - { - _context.Connection.Close(true); - } - catch - { - // catch errors sending the closing handshake - } - } - - internal void Close(HttpStatusCode code) - { - _context.Response.StatusCode = (int)code; - _context.Response.OutputStream.Dispose(); - } - - #endregion - - #region Public Methods - - /// <summary> - /// Returns a <see cref="string"/> that represents the current - /// <see cref="HttpListenerWebSocketContext"/>. - /// </summary> - /// <returns> - /// A <see cref="string"/> that represents the current - /// <see cref="HttpListenerWebSocketContext"/>. - /// </returns> - public override string ToString() - { - return _context.Request.ToString(); - } - - #endregion } } |
