From d6c1ed4b1c6b638a375881e4ddb3b05419b19d80 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 8 Jan 2016 21:01:56 -0800 Subject: [PATCH] Wildcard Regex pattern for Service Paths Adding the capabilities to allow a regex based pattern for service paths. Lets you be more flexible for service assignment. --- websocket-sharp/Server/HttpServer.cs | 4 ++-- websocket-sharp/Server/WebSocketServer.cs | 20 ++++++++-------- .../Server/WebSocketServiceManager.cs | 23 +++++++++++++++---- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/websocket-sharp/Server/HttpServer.cs b/websocket-sharp/Server/HttpServer.cs index d4ec6ad98..dbcfc0ea9 100644 --- a/websocket-sharp/Server/HttpServer.cs +++ b/websocket-sharp/Server/HttpServer.cs @@ -626,7 +626,7 @@ private string checkIfCertificateExists () return !(usr || port) ? "The secure connection requires a server certificate." : null; } - private void init (string hostname, System.Net.IPAddress address, int port, bool secure) + private void init (string hostname, System.Net.IPAddress address, int port, bool secure, bool wildcardServicesPath = false) { _hostname = hostname ?? address.ToString (); _address = address; @@ -638,7 +638,7 @@ private void init (string hostname, System.Net.IPAddress address, int port, bool String.Format ("http{0}://{1}:{2}/", secure ? "s" : "", _hostname, port)); _logger = _listener.Log; - _services = new WebSocketServiceManager (_logger); + _services = new WebSocketServiceManager (_logger, wildcardServicesPath); _sync = new object (); var os = Environment.OSVersion; diff --git a/websocket-sharp/Server/WebSocketServer.cs b/websocket-sharp/Server/WebSocketServer.cs index 457df8c6d..7e9bb4237 100644 --- a/websocket-sharp/Server/WebSocketServer.cs +++ b/websocket-sharp/Server/WebSocketServer.cs @@ -88,9 +88,9 @@ public class WebSocketServer /// An instance initialized by this constructor listens for the incoming connection requests on /// port 80. /// - public WebSocketServer () + public WebSocketServer (bool wildcardServicesPath = false) { - init (null, System.Net.IPAddress.Any, 80, false); + init (null, System.Net.IPAddress.Any, 80, false, wildcardServicesPath); } /// @@ -149,7 +149,7 @@ public WebSocketServer (int port) /// is invalid. /// /// - public WebSocketServer (string url) + public WebSocketServer (string url, bool wildcardServicesPath = false) { if (url == null) throw new ArgumentNullException ("url"); @@ -167,7 +167,7 @@ public WebSocketServer (string url) if (!addr.IsLocal ()) throw new ArgumentException ("The host part isn't a local host name: " + url, "url"); - init (host, addr, uri.Port, uri.Scheme == "wss"); + init (host, addr, uri.Port, uri.Scheme == "wss", wildcardServicesPath); } /// @@ -188,13 +188,13 @@ public WebSocketServer (string url) /// /// isn't between 1 and 65535 inclusive. /// - public WebSocketServer (int port, bool secure) + public WebSocketServer (int port, bool secure, bool wildcardServicesPath = false) { if (!port.IsPortNumber ()) throw new ArgumentOutOfRangeException ( "port", "Not between 1 and 65535 inclusive: " + port); - init (null, System.Net.IPAddress.Any, port, secure); + init (null, System.Net.IPAddress.Any, port, secure, wildcardServicesPath); } /// @@ -258,7 +258,7 @@ public WebSocketServer (System.Net.IPAddress address, int port) /// /// isn't between 1 and 65535 inclusive. /// - public WebSocketServer (System.Net.IPAddress address, int port, bool secure) + public WebSocketServer (System.Net.IPAddress address, int port, bool secure, bool wildcardServicesPath = false) { if (address == null) throw new ArgumentNullException ("address"); @@ -270,7 +270,7 @@ public WebSocketServer (System.Net.IPAddress address, int port, bool secure) throw new ArgumentOutOfRangeException ( "port", "Not between 1 and 65535 inclusive: " + port); - init (null, address, port, secure); + init (null, address, port, secure, wildcardServicesPath); } #endregion @@ -592,7 +592,7 @@ private string checkIfCertificateExists () : null; } - private void init (string hostname, System.Net.IPAddress address, int port, bool secure) + private void init (string hostname, System.Net.IPAddress address, int port, bool secure, bool wildcardServicesPath) { _hostname = hostname ?? address.ToString (); _address = address; @@ -603,7 +603,7 @@ private void init (string hostname, System.Net.IPAddress address, int port, bool _dnsStyle = Uri.CheckHostName (hostname) == UriHostNameType.Dns; _listener = new TcpListener (address, port); _logger = new Logger (); - _services = new WebSocketServiceManager (_logger); + _services = new WebSocketServiceManager (_logger, wildcardServicesPath); _sync = new object (); } diff --git a/websocket-sharp/Server/WebSocketServiceManager.cs b/websocket-sharp/Server/WebSocketServiceManager.cs index 8ed76b335..215d11d8f 100644 --- a/websocket-sharp/Server/WebSocketServiceManager.cs +++ b/websocket-sharp/Server/WebSocketServiceManager.cs @@ -50,17 +50,18 @@ public class WebSocketServiceManager private volatile ServerState _state; private object _sync; private TimeSpan _waitTime; + private bool _wildcardServices; #endregion #region Internal Constructors - internal WebSocketServiceManager () - : this (new Logger ()) + internal WebSocketServiceManager (bool wildcardServices = false) + : this (new Logger (), wildcardServices) { } - internal WebSocketServiceManager (Logger logger) + internal WebSocketServiceManager (Logger logger, bool wildcardServices) { _logger = logger; @@ -69,6 +70,7 @@ internal WebSocketServiceManager (Logger logger) _state = ServerState.Ready; _sync = ((ICollection) _hosts).SyncRoot; _waitTime = TimeSpan.FromSeconds (1); + _wildcardServices = wildcardServices; } #endregion @@ -314,8 +316,19 @@ internal bool InternalTryGetServiceHost (string path, out WebSocketServiceHost h { bool ret; lock (_sync) { - path = HttpUtility.UrlDecode (path).TrimEndSlash (); - ret = _hosts.TryGetValue (path, out host); + if (!_wildcardServices) { + path = HttpUtility.UrlDecode (path).TrimEndSlash (); + } + else { + foreach (var key in _hosts.Keys) { + if (new System.Text.RegularExpressions.Regex(key).IsMatch(path)) { + path = key; + break; + } + } + } + + ret = _hosts.TryGetValue(path, out host); } if (!ret)