diff --git a/websocket-sharp/Server/HttpServer.cs b/websocket-sharp/Server/HttpServer.cs
index 9966f0dc..360958e5 100644
--- a/websocket-sharp/Server/HttpServer.cs
+++ b/websocket-sharp/Server/HttpServer.cs
@@ -62,12 +62,13 @@ namespace WebSocketSharp.Server {
#region Private Fields
- private bool _isWindows;
private HttpListener _listener;
+ private bool _listening;
private int _port;
private Thread _receiveRequestThread;
private string _rootPath;
private ServiceHostManager _svcHosts;
+ private bool _windows;
#endregion
@@ -99,6 +100,18 @@ namespace WebSocketSharp.Server {
#region Public Properties
+ ///
+ /// Gets a value indicating whether the server has been started.
+ ///
+ ///
+ /// true if the server has been started; otherwise, false.
+ ///
+ public bool IsListening {
+ get {
+ return _listening;
+ }
+ }
+
///
/// Gets the port on which to listen for incoming requests.
///
@@ -125,7 +138,8 @@ namespace WebSocketSharp.Server {
}
set {
- _rootPath = value;
+ if (!_listening)
+ _rootPath = value;
}
}
@@ -220,18 +234,18 @@ namespace WebSocketSharp.Server {
private void init()
{
_listener = new HttpListener();
+ _listening = false;
+ _rootPath = getRootPath();
_svcHosts = new ServiceHostManager();
- _isWindows = false;
+ _windows = false;
var os = Environment.OSVersion;
if (os.Platform != PlatformID.Unix && os.Platform != PlatformID.MacOSX)
- _isWindows = true;
+ _windows = true;
var prefix = String.Format(
"http{0}://*:{1}/", _port == 443 ? "s" : String.Empty, _port);
_listener.Prefixes.Add(prefix);
-
- _rootPath = getRootPath();
}
private static string getRootPath()
@@ -252,7 +266,7 @@ namespace WebSocketSharp.Server {
{
#if DEBUG
var callerFrame = new StackFrame(1);
- var caller = callerFrame.GetMethod();
+ var caller = callerFrame.GetMethod();
Console.WriteLine("HTTPSV: Error@{0}: {1}", caller.Name, message);
#endif
OnError.Emit(this, new ErrorEventArgs(message));
@@ -382,9 +396,9 @@ namespace WebSocketSharp.Server {
private bool upgradeToWebSocket(HttpListenerContext context)
{
- var res = context.Response;
+ var res = context.Response;
var wsContext = context.AcceptWebSocket();
- var path = wsContext.Path.UrlDecode();
+ var path = wsContext.Path.UrlDecode();
IServiceHost svcHost;
if (!_svcHosts.TryGetServiceHost(path, out svcHost))
@@ -441,7 +455,7 @@ namespace WebSocketSharp.Server {
public byte[] GetFile(string path)
{
var filePath = _rootPath + path;
- if (_isWindows)
+ if (_windows)
filePath = filePath.Replace("/", "\\");
return File.Exists(filePath)
@@ -450,22 +464,30 @@ namespace WebSocketSharp.Server {
}
///
- /// Starts the .
+ /// Starts to receive the HTTP requests.
///
public void Start()
{
+ if (_listening)
+ return;
+
_listener.Start();
startReceiveRequestThread();
+ _listening = true;
}
///
- /// Shuts down the .
+ /// Stops receiving the HTTP requests.
///
public void Stop()
{
+ if (!_listening)
+ return;
+
_listener.Close();
_receiveRequestThread.Join(5 * 1000);
_svcHosts.Stop();
+ _listening = false;
}
#endregion
diff --git a/websocket-sharp/Server/WebSocketServer.cs b/websocket-sharp/Server/WebSocketServer.cs
index 9401394f..33dbfe97 100644
--- a/websocket-sharp/Server/WebSocketServer.cs
+++ b/websocket-sharp/Server/WebSocketServer.cs
@@ -88,7 +88,7 @@ namespace WebSocketSharp.Server {
throw new ArgumentException(msg, "url");
}
- init();
+ _svcHosts = new ServiceHostManager();
}
///
@@ -137,7 +137,7 @@ namespace WebSocketSharp.Server {
public WebSocketServer(System.Net.IPAddress address, int port, bool secure)
: base(address, port, "/", secure)
{
- init();
+ _svcHosts = new ServiceHostManager();
}
#endregion
@@ -155,6 +155,7 @@ namespace WebSocketSharp.Server {
var url = BaseUri.IsAbsoluteUri
? BaseUri.ToString().TrimEnd('/')
: String.Empty;
+
foreach (var path in _svcHosts.Paths)
yield return url + path;
}
@@ -180,15 +181,6 @@ namespace WebSocketSharp.Server {
#endregion
- #region Private Methods
-
- private void init()
- {
- _svcHosts = new ServiceHostManager();
- }
-
- #endregion
-
#region Protected Methods
///
@@ -199,18 +191,18 @@ namespace WebSocketSharp.Server {
///
protected override void AcceptWebSocket(TcpListenerWebSocketContext context)
{
- var websocket = context.WebSocket;
- var path = context.Path.UrlDecode();
+ var ws = context.WebSocket;
+ var path = context.Path.UrlDecode();
IServiceHost svcHost;
if (!_svcHosts.TryGetServiceHost(path, out svcHost))
{
- websocket.Close(HttpStatusCode.NotImplemented);
+ ws.Close(HttpStatusCode.NotImplemented);
return;
}
if (BaseUri.IsAbsoluteUri)
- websocket.Url = new Uri(BaseUri, path);
+ ws.Url = new Uri(BaseUri, path);
svcHost.BindWebSocket(context);
}
@@ -242,6 +234,7 @@ namespace WebSocketSharp.Server {
svcHost.Uri = BaseUri.IsAbsoluteUri
? new Uri(BaseUri, absPath)
: absPath.ToUri();
+
if (!Sweeping)
svcHost.Sweeping = false;
diff --git a/websocket-sharp/Server/WebSocketServerBase.cs b/websocket-sharp/Server/WebSocketServerBase.cs
index 0b930cf3..7c488e68 100644
--- a/websocket-sharp/Server/WebSocketServerBase.cs
+++ b/websocket-sharp/Server/WebSocketServerBase.cs
@@ -45,11 +45,12 @@ namespace WebSocketSharp.Server {
#region Private Fields
- private Thread _receiveRequestThread;
private IPAddress _address;
- private bool _isSecure;
- private bool _isSelfHost;
+ private bool _listening;
private int _port;
+ private Thread _receiveRequestThread;
+ private bool _secure;
+ private bool _selfHost;
private TcpListener _tcpListener;
private Uri _uri;
@@ -62,7 +63,7 @@ namespace WebSocketSharp.Server {
///
protected WebSocketServerBase()
{
- _isSelfHost = false;
+ _selfHost = false;
}
///
@@ -133,7 +134,7 @@ namespace WebSocketSharp.Server {
if (!absPath.IsValidAbsolutePath(out msg))
throw new ArgumentException(msg, "absPath");
- if ((port == 80 && secure) ||
+ if ((port == 80 && secure) ||
(port == 443 && !secure))
{
msg = String.Format(
@@ -141,12 +142,10 @@ namespace WebSocketSharp.Server {
throw new ArgumentException(msg);
}
- _address = address;
- _port = port > 0
- ? port
- : secure ? 443 : 80;
- _uri = absPath.ToUri();
- _isSecure = secure;
+ _address = address;
+ _port = port > 0 ? port : secure ? 443 : 80;
+ _uri = absPath.ToUri();
+ _secure = secure;
init();
}
@@ -161,8 +160,7 @@ namespace WebSocketSharp.Server {
///
/// A that contains a WebSocket URL.
///
- protected Uri BaseUri
- {
+ protected Uri BaseUri {
get {
return _uri;
}
@@ -188,6 +186,18 @@ namespace WebSocketSharp.Server {
}
}
+ ///
+ /// Gets a value indicating whether the server has been started.
+ ///
+ ///
+ /// true if the server has been started; otherwise, false.
+ ///
+ public bool IsListening {
+ get {
+ return _listening;
+ }
+ }
+
///
/// Gets a value indicating whether the server provides secure connection.
///
@@ -196,7 +206,7 @@ namespace WebSocketSharp.Server {
///
public bool IsSecure {
get {
- return _isSecure;
+ return _secure;
}
}
@@ -208,7 +218,7 @@ namespace WebSocketSharp.Server {
///
public bool IsSelfHost {
get {
- return _isSelfHost;
+ return _selfHost;
}
}
@@ -237,43 +247,24 @@ namespace WebSocketSharp.Server {
#region Private Methods
- private void acceptWebSocketAsync(TcpListenerWebSocketContext context)
- {
- WaitCallback callback = (state) =>
- {
- try
- {
- AcceptWebSocket(context);
- }
- catch (Exception ex)
- {
- onError(ex.Message);
- }
- };
-
- ThreadPool.QueueUserWorkItem(callback);
- }
-
private void init()
{
+ _listening = false;
+ _selfHost = true;
_tcpListener = new TcpListener(_address, _port);
- _isSelfHost = true;
}
private void init(Uri uri)
{
var scheme = uri.Scheme;
- var host = uri.DnsSafeHost;
- var port = uri.Port;
- var addrs = Dns.GetHostAddresses(host);
-
- _uri = uri;
- _address = addrs[0];
- _isSecure = scheme == "wss" ? true : false;
- _port = port > 0
- ? port
- : _isSecure ? 443 : 80;
-
+ var host = uri.DnsSafeHost;
+ var port = uri.Port;
+ var addrs = Dns.GetHostAddresses(host);
+
+ _uri = uri;
+ _address = addrs[0];
+ _secure = scheme == "wss" ? true : false;
+ _port = port > 0 ? port : _secure ? 443 : 80;
init();
}
@@ -281,20 +272,37 @@ namespace WebSocketSharp.Server {
{
#if DEBUG
var callerFrame = new StackFrame(1);
- var caller = callerFrame.GetMethod();
+ var caller = callerFrame.GetMethod();
Console.WriteLine("WSSV: Error@{0}: {1}", caller.Name, message);
#endif
OnError.Emit(this, new ErrorEventArgs(message));
}
+ private void processRequestAsync(TcpListenerWebSocketContext context)
+ {
+ WaitCallback callback = (state) =>
+ {
+ try
+ {
+ AcceptWebSocket(context);
+ }
+ catch (Exception ex)
+ {
+ onError(ex.Message);
+ }
+ };
+
+ ThreadPool.QueueUserWorkItem(callback);
+ }
+
private void receiveRequest()
{
while (true)
{
try
{
- var context = _tcpListener.AcceptWebSocket(_isSecure);
- acceptWebSocketAsync(context);
+ var context = _tcpListener.AcceptWebSocket(_secure);
+ processRequestAsync(context);
}
catch (SocketException)
{
@@ -323,8 +331,9 @@ namespace WebSocketSharp.Server {
if (!result.Query.IsNullOrEmpty())
{
- result = null;
+ result = null;
message = "Must not contain the query component: " + uriString;
+
return false;
}
@@ -363,11 +372,12 @@ namespace WebSocketSharp.Server {
///
public virtual void Start()
{
- if (!_isSelfHost)
+ if (!_selfHost || _listening)
return;
_tcpListener.Start();
startReceiveRequestThread();
+ _listening = true;
}
///
@@ -375,11 +385,12 @@ namespace WebSocketSharp.Server {
///
public virtual void Stop()
{
- if (!_isSelfHost)
+ if (!_selfHost || !_listening)
return;
_tcpListener.Stop();
_receiveRequestThread.Join(5 * 1000);
+ _listening = false;
}
#endregion
diff --git a/websocket-sharp/Server/WebSocketServiceHost.cs b/websocket-sharp/Server/WebSocketServiceHost.cs
index acf8638d..3d01f2c5 100644
--- a/websocket-sharp/Server/WebSocketServiceHost.cs
+++ b/websocket-sharp/Server/WebSocketServiceHost.cs
@@ -58,7 +58,7 @@ namespace WebSocketSharp.Server {
internal WebSocketServiceHost()
{
- init();
+ _sessions = new WebSocketServiceManager();
}
#endregion
@@ -87,7 +87,7 @@ namespace WebSocketSharp.Server {
public WebSocketServiceHost(string url)
: base(url)
{
- init();
+ _sessions = new WebSocketServiceManager();
}
///
@@ -175,7 +175,7 @@ namespace WebSocketSharp.Server {
public WebSocketServiceHost(System.Net.IPAddress address, int port, string absPath, bool secure)
: base(address, port, absPath, secure)
{
- init();
+ _sessions = new WebSocketServiceManager();
}
#endregion
@@ -218,15 +218,6 @@ namespace WebSocketSharp.Server {
#endregion
- #region Private Methods
-
- private void init()
- {
- _sessions = new WebSocketServiceManager();
- }
-
- #endregion
-
#region Protected Methods
///
@@ -237,16 +228,16 @@ namespace WebSocketSharp.Server {
///
protected override void AcceptWebSocket(TcpListenerWebSocketContext context)
{
- var websocket = context.WebSocket;
+ var ws = context.WebSocket;
var path = context.Path.UrlDecode();
if (path != Uri.GetAbsolutePath().UrlDecode())
{
- websocket.Close(HttpStatusCode.NotImplemented);
+ ws.Close(HttpStatusCode.NotImplemented);
return;
}
if (Uri.IsAbsoluteUri)
- websocket.Url = Uri;
+ ws.Url = Uri;
((IServiceHost)this).BindWebSocket(context);
}