|
|
|
|
@ -28,38 +28,21 @@
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Configuration;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using WebSocketSharp.Net;
|
|
|
|
|
|
|
|
|
|
namespace WebSocketSharp.Server {
|
|
|
|
|
|
|
|
|
|
namespace WebSocketSharp.Server
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Provides a simple HTTP server that allows to accept the WebSocket connection requests.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// <para>
|
|
|
|
|
/// The HttpServer instance can provide the multi WebSocket services.
|
|
|
|
|
/// </para>
|
|
|
|
|
/// <para>
|
|
|
|
|
/// <para>
|
|
|
|
|
/// The HttpServer instance can set the document root path of server using
|
|
|
|
|
/// the application configuration file or <see cref="RootPath"/> property.
|
|
|
|
|
/// </para>
|
|
|
|
|
/// <code lang="xml">
|
|
|
|
|
/// <?xml version="1.0" encoding="utf-8"?>
|
|
|
|
|
/// <configuration>
|
|
|
|
|
/// <appSettings>
|
|
|
|
|
/// <add key="RootPath" value="./Public" />
|
|
|
|
|
/// </appSettings>
|
|
|
|
|
/// </configuration>
|
|
|
|
|
/// </code>
|
|
|
|
|
/// </para>
|
|
|
|
|
/// </remarks>
|
|
|
|
|
public class HttpServer {
|
|
|
|
|
|
|
|
|
|
public class HttpServer
|
|
|
|
|
{
|
|
|
|
|
#region Private Fields
|
|
|
|
|
|
|
|
|
|
private HttpListener _listener;
|
|
|
|
|
@ -118,7 +101,7 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// The default logging level is the <see cref="LogLevel.ERROR"/>.
|
|
|
|
|
/// If you wanted to change the current logging level, you would set the <c>Log.Level</c> property
|
|
|
|
|
/// If you want to change the current logging level, you set the <c>Log.Level</c> property
|
|
|
|
|
/// to one of the <see cref="LogLevel"/> values which you want.
|
|
|
|
|
/// </remarks>
|
|
|
|
|
/// <value>
|
|
|
|
|
@ -146,9 +129,8 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
/// Gets or sets the document root path of server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>
|
|
|
|
|
/// An <see cref="string"/> that contains the document root path of server.
|
|
|
|
|
/// The default value is set from the application configuration file if is available;
|
|
|
|
|
/// otherwise, <c>./Public</c>.
|
|
|
|
|
/// A <see cref="string"/> that contains the document root path of server.
|
|
|
|
|
/// The default value is <c>./Public</c>.
|
|
|
|
|
/// </value>
|
|
|
|
|
public string RootPath {
|
|
|
|
|
get {
|
|
|
|
|
@ -259,7 +241,7 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
_listener = new HttpListener ();
|
|
|
|
|
_listening = false;
|
|
|
|
|
_logger = new Logger ();
|
|
|
|
|
_rootPath = getRootPath();
|
|
|
|
|
_rootPath = "./Public";
|
|
|
|
|
_svcHosts = new ServiceHostManager ();
|
|
|
|
|
|
|
|
|
|
_windows = false;
|
|
|
|
|
@ -267,25 +249,10 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
if (os.Platform != PlatformID.Unix && os.Platform != PlatformID.MacOSX)
|
|
|
|
|
_windows = true;
|
|
|
|
|
|
|
|
|
|
var prefix = String.Format(
|
|
|
|
|
"http{0}://*:{1}/", _port == 443 ? "s" : String.Empty, _port);
|
|
|
|
|
var prefix = String.Format ("http{0}://*:{1}/", _port == 443 ? "s" : "", _port);
|
|
|
|
|
_listener.Prefixes.Add (prefix);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string getRootPath()
|
|
|
|
|
{
|
|
|
|
|
string rootPath = null;
|
|
|
|
|
try {
|
|
|
|
|
rootPath = ConfigurationManager.AppSettings["RootPath"];
|
|
|
|
|
}
|
|
|
|
|
catch {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rootPath.IsNullOrEmpty()
|
|
|
|
|
? "./Public"
|
|
|
|
|
: rootPath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void processHttpRequest (HttpListenerContext context)
|
|
|
|
|
{
|
|
|
|
|
var eventArgs = new HttpRequestEventArgs (context);
|
|
|
|
|
@ -367,10 +334,9 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
|
|
|
|
|
private void processRequestAsync (HttpListenerContext context)
|
|
|
|
|
{
|
|
|
|
|
WaitCallback callback = (state) =>
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
WaitCallback callback = state =>
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
if (context.Request.IsUpgradeTo ("websocket"))
|
|
|
|
|
{
|
|
|
|
|
if (processWebSocketRequest (context))
|
|
|
|
|
@ -383,8 +349,7 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
|
|
|
|
|
context.Response.Close ();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
catch (Exception ex) {
|
|
|
|
|
_logger.Fatal (ex.Message);
|
|
|
|
|
error ("An exception has occured.");
|
|
|
|
|
}
|
|
|
|
|
@ -397,17 +362,14 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
processRequestAsync (_listener.GetContext ());
|
|
|
|
|
}
|
|
|
|
|
catch (HttpListenerException)
|
|
|
|
|
{
|
|
|
|
|
// HttpListener has been closed.
|
|
|
|
|
catch (HttpListenerException) {
|
|
|
|
|
_logger.Info ("HttpListener has been stopped.");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
catch (Exception ex) {
|
|
|
|
|
_logger.Fatal (ex.Message);
|
|
|
|
|
error ("An exception has occured.");
|
|
|
|
|
|
|
|
|
|
@ -428,7 +390,7 @@ namespace WebSocketSharp.Server {
|
|
|
|
|
#region Public Methods
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Adds the specified type WebSocket service.
|
|
|
|
|
/// Adds the specified typed WebSocket service.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="absPath">
|
|
|
|
|
/// A <see cref="string"/> that contains an absolute path associated with the WebSocket service.
|
|
|
|
|
|