aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener/Net/WebSockets
diff options
context:
space:
mode:
authorClaus Vium <clausvium@gmail.com>2019-02-21 10:07:21 +0100
committerClaus Vium <clausvium@gmail.com>2019-02-26 22:11:21 +0100
commit4db31acff940dc9cabbd39649103faf4dc2e2c47 (patch)
tree4472b2330124f2bfea3f9dcdfcd5508cedd84570 /SocketHttpListener/Net/WebSockets
parent968e282c907f57d7998b6435cadae2f0a5ec832c (diff)
Begin removing System.Net sources
Diffstat (limited to 'SocketHttpListener/Net/WebSockets')
-rw-r--r--SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs92
-rw-r--r--SocketHttpListener/Net/WebSockets/HttpWebSocket.Managed.cs81
-rw-r--r--SocketHttpListener/Net/WebSockets/HttpWebSocket.cs159
-rw-r--r--SocketHttpListener/Net/WebSockets/WebSocketCloseStatus.cs27
-rw-r--r--SocketHttpListener/Net/WebSockets/WebSocketContext.cs24
-rw-r--r--SocketHttpListener/Net/WebSockets/WebSocketValidate.cs141
6 files changed, 0 insertions, 524 deletions
diff --git a/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs b/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs
deleted file mode 100644
index 5ed49ec47..000000000
--- a/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Net;
-using System.Security.Principal;
-using MediaBrowser.Model.Services;
-
-namespace SocketHttpListener.Net.WebSockets
-{
- public class HttpListenerWebSocketContext : WebSocketContext
- {
- 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 readonly string _origin;
- private readonly IEnumerable<string> _secWebSocketProtocols;
- private readonly string _secWebSocketVersion;
- private readonly string _secWebSocketKey;
-
- private readonly WebSocket _webSocket;
-
- internal HttpListenerWebSocketContext(
- 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)
- {
- _cookieCollection = new CookieCollection();
- _cookieCollection.Add(cookieCollection);
-
- //_headers = new NameValueCollection(headers);
- _headers = headers;
- _user = CopyPrincipal(user);
-
- _requestUri = requestUri;
- _isAuthenticated = isAuthenticated;
- _isLocal = isLocal;
- _isSecureConnection = isSecureConnection;
- _origin = origin;
- _secWebSocketProtocols = secWebSocketProtocols;
- _secWebSocketVersion = secWebSocketVersion;
- _secWebSocketKey = secWebSocketKey;
- _webSocket = webSocket;
- }
-
- public override Uri RequestUri => _requestUri;
-
- public override QueryParamCollection Headers => _headers;
-
- public override string Origin => _origin;
-
- public override IEnumerable<string> SecWebSocketProtocols => _secWebSocketProtocols;
-
- public override string SecWebSocketVersion => _secWebSocketVersion;
-
- public override string SecWebSocketKey => _secWebSocketKey;
-
- public override CookieCollection CookieCollection => _cookieCollection;
-
- public override IPrincipal User => _user;
-
- public override bool IsAuthenticated => _isAuthenticated;
-
- public override bool IsLocal => _isLocal;
-
- public override bool IsSecureConnection => _isSecureConnection;
-
- public override WebSocket WebSocket => _webSocket;
-
- private static IPrincipal CopyPrincipal(IPrincipal user)
- {
- if (user != null)
- {
- throw new NotImplementedException();
- }
-
- return null;
- }
- }
-}
diff --git a/SocketHttpListener/Net/WebSockets/HttpWebSocket.Managed.cs b/SocketHttpListener/Net/WebSockets/HttpWebSocket.Managed.cs
deleted file mode 100644
index 1cfd2dc90..000000000
--- a/SocketHttpListener/Net/WebSockets/HttpWebSocket.Managed.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using System;
-using System.Threading.Tasks;
-
-namespace SocketHttpListener.Net.WebSockets
-{
- internal static partial class HttpWebSocket
- {
- private const string SupportedVersion = "13";
-
- internal static async Task<HttpListenerWebSocketContext> AcceptWebSocketAsyncCore(HttpListenerContext context,
- string subProtocol,
- int receiveBufferSize,
- TimeSpan keepAliveInterval,
- ArraySegment<byte>? internalBuffer = null)
- {
- ValidateOptions(subProtocol, receiveBufferSize, MinSendBufferSize, keepAliveInterval);
-
- // get property will create a new response if one doesn't exist.
- HttpListenerResponse response = context.Response;
- HttpListenerRequest request = context.Request;
- ValidateWebSocketHeaders(context);
-
- string secWebSocketVersion = request.Headers[HttpKnownHeaderNames.SecWebSocketVersion];
-
- // Optional for non-browser client
- string origin = request.Headers[HttpKnownHeaderNames.Origin];
-
- string[] secWebSocketProtocols = null;
- bool shouldSendSecWebSocketProtocolHeader =
- ProcessWebSocketProtocolHeader(
- request.Headers[HttpKnownHeaderNames.SecWebSocketProtocol],
- subProtocol,
- out var outgoingSecWebSocketProtocolString);
-
- if (shouldSendSecWebSocketProtocolHeader)
- {
- secWebSocketProtocols = new string[] { outgoingSecWebSocketProtocolString };
- response.Headers.Add(HttpKnownHeaderNames.SecWebSocketProtocol, outgoingSecWebSocketProtocolString);
- }
-
- // negotiate the websocket key return value
- string secWebSocketKey = request.Headers[HttpKnownHeaderNames.SecWebSocketKey];
- string secWebSocketAccept = HttpWebSocket.GetSecWebSocketAcceptString(secWebSocketKey);
-
- response.Headers.Add(HttpKnownHeaderNames.Connection, HttpKnownHeaderNames.Upgrade);
- response.Headers.Add(HttpKnownHeaderNames.Upgrade, WebSocketUpgradeToken);
- response.Headers.Add(HttpKnownHeaderNames.SecWebSocketAccept, secWebSocketAccept);
-
- response.StatusCode = (int)HttpStatusCode.SwitchingProtocols; // HTTP 101
- response.StatusDescription = HttpStatusDescription.Get(HttpStatusCode.SwitchingProtocols);
-
- var responseStream = response.OutputStream as HttpResponseStream;
-
- // Send websocket handshake headers
- await responseStream.WriteWebSocketHandshakeHeadersAsync().ConfigureAwait(false);
-
- //WebSocket webSocket = WebSocket.CreateFromStream(context.Connection.ConnectedStream, isServer: true, subProtocol, keepAliveInterval);
- var webSocket = new WebSocket(subProtocol);
-
- var webSocketContext = new HttpListenerWebSocketContext(
- request.Url,
- request.Headers,
- request.Cookies,
- context.User,
- request.IsAuthenticated,
- request.IsLocal,
- request.IsSecureConnection,
- origin,
- secWebSocketProtocols != null ? secWebSocketProtocols : Array.Empty<string>(),
- secWebSocketVersion,
- secWebSocketKey,
- webSocket);
-
- webSocket.SetContext(webSocketContext, context.Connection.Close, context.Connection.Stream);
-
- return webSocketContext;
- }
-
- private const bool WebSocketsSupported = true;
- }
-}
diff --git a/SocketHttpListener/Net/WebSockets/HttpWebSocket.cs b/SocketHttpListener/Net/WebSockets/HttpWebSocket.cs
deleted file mode 100644
index b346cc98e..000000000
--- a/SocketHttpListener/Net/WebSockets/HttpWebSocket.cs
+++ /dev/null
@@ -1,159 +0,0 @@
-using System;
-using System.Diagnostics.CodeAnalysis;
-using System.Security.Cryptography;
-using System.Text;
-using System.Threading;
-
-namespace SocketHttpListener.Net.WebSockets
-{
- internal static partial class HttpWebSocket
- {
- internal const string SecWebSocketKeyGuid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
- internal const string WebSocketUpgradeToken = "websocket";
- internal const int DefaultReceiveBufferSize = 16 * 1024;
- internal const int DefaultClientSendBufferSize = 16 * 1024;
-
- [SuppressMessage("Microsoft.Security", "CA5350", Justification = "SHA1 used only for hashing purposes, not for crypto.")]
- internal static string GetSecWebSocketAcceptString(string secWebSocketKey)
- {
- string retVal;
-
- // SHA1 used only for hashing purposes, not for crypto. Check here for FIPS compat.
- using (var sha1 = SHA1.Create())
- {
- string acceptString = string.Concat(secWebSocketKey, HttpWebSocket.SecWebSocketKeyGuid);
- byte[] toHash = Encoding.UTF8.GetBytes(acceptString);
- retVal = Convert.ToBase64String(sha1.ComputeHash(toHash));
- }
-
- return retVal;
- }
-
- // return value here signifies if a Sec-WebSocket-Protocol header should be returned by the server.
- internal static bool ProcessWebSocketProtocolHeader(string clientSecWebSocketProtocol,
- string subProtocol,
- out string acceptProtocol)
- {
- acceptProtocol = string.Empty;
- if (string.IsNullOrEmpty(clientSecWebSocketProtocol))
- {
- // client hasn't specified any Sec-WebSocket-Protocol header
- if (subProtocol != null)
- {
- // If the server specified _anything_ this isn't valid.
- throw new WebSocketException("UnsupportedProtocol");
- }
- // Treat empty and null from the server as the same thing here, server should not send headers.
- return false;
- }
-
- // here, we know the client specified something and it's non-empty.
-
- if (subProtocol == null)
- {
- // client specified some protocols, server specified 'null'. So server should send headers.
- return true;
- }
-
- // here, we know that the client has specified something, it's not empty
- // and the server has specified exactly one protocol
-
- string[] requestProtocols = clientSecWebSocketProtocol.Split(new char[] { ',' },
- StringSplitOptions.RemoveEmptyEntries);
- acceptProtocol = subProtocol;
-
- // client specified protocols, serverOptions has exactly 1 non-empty entry. Check that
- // this exists in the list the client specified.
- for (int i = 0; i < requestProtocols.Length; i++)
- {
- string currentRequestProtocol = requestProtocols[i].Trim();
- if (string.Equals(acceptProtocol, currentRequestProtocol, StringComparison.OrdinalIgnoreCase))
- {
- return true;
- }
- }
-
- throw new WebSocketException("net_WebSockets_AcceptUnsupportedProtocol");
- }
-
- internal static void ValidateOptions(string subProtocol, int receiveBufferSize, int sendBufferSize, TimeSpan keepAliveInterval)
- {
- if (subProtocol != null)
- {
- WebSocketValidate.ValidateSubprotocol(subProtocol);
- }
-
- if (receiveBufferSize < MinReceiveBufferSize)
- {
- throw new ArgumentOutOfRangeException(nameof(receiveBufferSize), "The receiveBufferSize was too small.");
- }
-
- if (sendBufferSize < MinSendBufferSize)
- {
- throw new ArgumentOutOfRangeException(nameof(sendBufferSize), "The sendBufferSize was too small.");
- }
-
- if (receiveBufferSize > MaxBufferSize)
- {
- throw new ArgumentOutOfRangeException(nameof(receiveBufferSize), "The receiveBufferSize was too large.");
- }
-
- if (sendBufferSize > MaxBufferSize)
- {
- throw new ArgumentOutOfRangeException(nameof(sendBufferSize), "The sendBufferSize was too large.");
- }
-
- if (keepAliveInterval < Timeout.InfiniteTimeSpan) // -1 millisecond
- {
- throw new ArgumentOutOfRangeException(nameof(keepAliveInterval), "The keepAliveInterval was too small.");
- }
- }
-
- internal const int MinSendBufferSize = 16;
- internal const int MinReceiveBufferSize = 256;
- internal const int MaxBufferSize = 64 * 1024;
-
- private static void ValidateWebSocketHeaders(HttpListenerContext context)
- {
- if (!WebSocketsSupported)
- {
- throw new PlatformNotSupportedException("net_WebSockets_UnsupportedPlatform");
- }
-
- if (!context.Request.IsWebSocketRequest)
- {
- throw new WebSocketException("net_WebSockets_AcceptNotAWebSocket");
- }
-
- string secWebSocketVersion = context.Request.Headers[HttpKnownHeaderNames.SecWebSocketVersion];
- if (string.IsNullOrEmpty(secWebSocketVersion))
- {
- throw new WebSocketException("net_WebSockets_AcceptHeaderNotFound");
- }
-
- if (!string.Equals(secWebSocketVersion, SupportedVersion, StringComparison.OrdinalIgnoreCase))
- {
- throw new WebSocketException("net_WebSockets_AcceptUnsupportedWebSocketVersion");
- }
-
- string secWebSocketKey = context.Request.Headers[HttpKnownHeaderNames.SecWebSocketKey];
- bool isSecWebSocketKeyInvalid = string.IsNullOrWhiteSpace(secWebSocketKey);
- if (!isSecWebSocketKeyInvalid)
- {
- try
- {
- // key must be 16 bytes then base64-encoded
- isSecWebSocketKeyInvalid = Convert.FromBase64String(secWebSocketKey).Length != 16;
- }
- catch
- {
- isSecWebSocketKeyInvalid = true;
- }
- }
- if (isSecWebSocketKeyInvalid)
- {
- throw new WebSocketException("net_WebSockets_AcceptHeaderNotFound");
- }
- }
- }
-}
diff --git a/SocketHttpListener/Net/WebSockets/WebSocketCloseStatus.cs b/SocketHttpListener/Net/WebSockets/WebSocketCloseStatus.cs
deleted file mode 100644
index 5ac89cf48..000000000
--- a/SocketHttpListener/Net/WebSockets/WebSocketCloseStatus.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-namespace SocketHttpListener.Net.WebSockets
-{
- public enum WebSocketCloseStatus
- {
- NormalClosure = 1000,
- EndpointUnavailable = 1001,
- ProtocolError = 1002,
- InvalidMessageType = 1003,
- Empty = 1005,
- // AbnormalClosure = 1006, // 1006 is reserved and should never be used by user
- InvalidPayloadData = 1007,
- PolicyViolation = 1008,
- MessageTooBig = 1009,
- MandatoryExtension = 1010,
- InternalServerError = 1011
- // TLSHandshakeFailed = 1015, // 1015 is reserved and should never be used by user
-
- // 0 - 999 Status codes in the range 0-999 are not used.
- // 1000 - 1999 Status codes in the range 1000-1999 are reserved for definition by this protocol.
- // 2000 - 2999 Status codes in the range 2000-2999 are reserved for use by extensions.
- // 3000 - 3999 Status codes in the range 3000-3999 MAY be used by libraries and frameworks. The
- // interpretation of these codes is undefined by this protocol. End applications MUST
- // NOT use status codes in this range.
- // 4000 - 4999 Status codes in the range 4000-4999 MAY be used by application code. The interpretation
- // of these codes is undefined by this protocol.
- }
-}
diff --git a/SocketHttpListener/Net/WebSockets/WebSocketContext.cs b/SocketHttpListener/Net/WebSockets/WebSocketContext.cs
deleted file mode 100644
index 10ad86439..000000000
--- a/SocketHttpListener/Net/WebSockets/WebSocketContext.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Net;
-using System.Security.Principal;
-using MediaBrowser.Model.Services;
-
-namespace SocketHttpListener.Net.WebSockets
-{
- public abstract class WebSocketContext
- {
- public abstract Uri RequestUri { get; }
- public abstract QueryParamCollection Headers { get; }
- public abstract string Origin { get; }
- public abstract IEnumerable<string> SecWebSocketProtocols { get; }
- public abstract string SecWebSocketVersion { get; }
- public abstract string SecWebSocketKey { get; }
- public abstract CookieCollection CookieCollection { get; }
- public abstract IPrincipal User { get; }
- public abstract bool IsAuthenticated { get; }
- public abstract bool IsLocal { get; }
- public abstract bool IsSecureConnection { get; }
- public abstract WebSocket WebSocket { get; }
- }
-}
diff --git a/SocketHttpListener/Net/WebSockets/WebSocketValidate.cs b/SocketHttpListener/Net/WebSockets/WebSocketValidate.cs
deleted file mode 100644
index 0469e3b6c..000000000
--- a/SocketHttpListener/Net/WebSockets/WebSocketValidate.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-using System;
-using System.Globalization;
-using System.Text;
-using WebSocketState = System.Net.WebSockets.WebSocketState;
-
-namespace SocketHttpListener.Net.WebSockets
-{
- internal static partial class WebSocketValidate
- {
- internal const int MaxControlFramePayloadLength = 123;
- private const int CloseStatusCodeAbort = 1006;
- private const int CloseStatusCodeFailedTLSHandshake = 1015;
- private const int InvalidCloseStatusCodesFrom = 0;
- private const int InvalidCloseStatusCodesTo = 999;
- private const string Separators = "()<>@,;:\\\"/[]?={} ";
-
- internal static void ThrowIfInvalidState(WebSocketState currentState, bool isDisposed, WebSocketState[] validStates)
- {
- string validStatesText = string.Empty;
-
- if (validStates != null && validStates.Length > 0)
- {
- foreach (WebSocketState validState in validStates)
- {
- if (currentState == validState)
- {
- // Ordering is important to maintain .NET 4.5 WebSocket implementation exception behavior.
- if (isDisposed)
- {
- throw new ObjectDisposedException(nameof(WebSocket));
- }
-
- return;
- }
- }
-
- validStatesText = string.Join(", ", validStates);
- }
-
- throw new WebSocketException("net_WebSockets_InvalidState");
- }
-
- internal static void ValidateSubprotocol(string subProtocol)
- {
- if (string.IsNullOrWhiteSpace(subProtocol))
- {
- throw new ArgumentException("net_WebSockets_InvalidEmptySubProtocol");
- }
-
- string invalidChar = null;
- int i = 0;
- while (i < subProtocol.Length)
- {
- char ch = subProtocol[i];
- if (ch < 0x21 || ch > 0x7e)
- {
- invalidChar = string.Format(CultureInfo.InvariantCulture, "[{0}]", (int)ch);
- break;
- }
-
- if (!char.IsLetterOrDigit(ch) &&
- Separators.IndexOf(ch) >= 0)
- {
- invalidChar = ch.ToString();
- break;
- }
-
- i++;
- }
-
- if (invalidChar != null)
- {
- throw new ArgumentException("net_WebSockets_InvalidCharInProtocolString");
- }
- }
-
- internal static void ValidateCloseStatus(WebSocketCloseStatus closeStatus, string statusDescription)
- {
- if (closeStatus == WebSocketCloseStatus.Empty && !string.IsNullOrEmpty(statusDescription))
- {
- throw new ArgumentException("net_WebSockets_ReasonNotNull");
- }
-
- int closeStatusCode = (int)closeStatus;
-
- if ((closeStatusCode >= InvalidCloseStatusCodesFrom &&
- closeStatusCode <= InvalidCloseStatusCodesTo) ||
- closeStatusCode == CloseStatusCodeAbort ||
- closeStatusCode == CloseStatusCodeFailedTLSHandshake)
- {
- // CloseStatus 1006 means Aborted - this will never appear on the wire and is reflected by calling WebSocket.Abort
- throw new ArgumentException("net_WebSockets_InvalidCloseStatusCode");
- }
-
- int length = 0;
- if (!string.IsNullOrEmpty(statusDescription))
- {
- length = Encoding.UTF8.GetByteCount(statusDescription);
- }
-
- if (length > MaxControlFramePayloadLength)
- {
- throw new ArgumentException("net_WebSockets_InvalidCloseStatusDescription");
- }
- }
-
- internal static void ValidateArraySegment(ArraySegment<byte> arraySegment, string parameterName)
- {
- if (arraySegment.Array == null)
- {
- throw new ArgumentNullException(parameterName + "." + nameof(arraySegment.Array));
- }
- if (arraySegment.Offset < 0 || arraySegment.Offset > arraySegment.Array.Length)
- {
- throw new ArgumentOutOfRangeException(parameterName + "." + nameof(arraySegment.Offset));
- }
- if (arraySegment.Count < 0 || arraySegment.Count > (arraySegment.Array.Length - arraySegment.Offset))
- {
- throw new ArgumentOutOfRangeException(parameterName + "." + nameof(arraySegment.Count));
- }
- }
-
- internal static void ValidateBuffer(byte[] buffer, int offset, int count)
- {
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
-
- if (offset < 0 || offset > buffer.Length)
- {
- throw new ArgumentOutOfRangeException(nameof(offset));
- }
-
- if (count < 0 || count > (buffer.Length - offset))
- {
- throw new ArgumentOutOfRangeException(nameof(count));
- }
- }
- }
-}