Renamed namespace for easier access

Added tests for stopping the server properly
This commit is contained in:
Alexandru Macocian
2020-03-06 11:07:47 +01:00
parent 310555324a
commit 247f1b27e7
34 changed files with 102 additions and 78 deletions
+3 -3
View File
@@ -2,9 +2,9 @@
using MTSC.Common.WebSockets.ServerModules;
using MTSC.Exceptions;
using MTSC.Logging;
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.Server.UsageMonitors;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
using MTSC.ServerSide.UsageMonitors;
using System;
using System.Numerics;
using System.Security.Cryptography;
+3 -3
View File
@@ -4,7 +4,7 @@ using MTSC.Common.Http.RoutingModules;
using MTSC.Common.Http.ServerModules;
using MTSC.Exceptions;
using MTSC.Logging;
using MTSC.Server.Handlers;
using MTSC.ServerSide.Handlers;
using System;
using System.Diagnostics;
using System.Linq;
@@ -23,12 +23,12 @@ namespace MTSC.UnitTests
private volatile byte[] receivedMessage = null;
private static int stressIterations = 1000;
public TestContext TestContext { get; set; }
static Server.Server Server { get; set; }
static ServerSide.Server Server { get; set; }
[ClassInitialize]
public static void InitializeServer(TestContext testContext)
{
Server = new Server.Server(800)
Server = new ServerSide.Server(800)
.AddHandler(new WebsocketHandler()
.AddWebsocketHandler(new Common.WebSockets.ServerModules.EchoModule()))
.AddHandler(new HttpHandler()
+2 -2
View File
@@ -1,12 +1,12 @@
using MTSC.Common.Http;
using MTSC.Common.Http.RoutingModules;
using MTSC.Server;
using MTSC.ServerSide;
namespace MTSC.UnitTests
{
public class EchoModule : HttpRouteBase
{
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server)
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, ServerSide.Server server)
{
return new HttpResponse { BodyString = request.BodyString, StatusCode = HttpMessage.StatusCodes.OK };
}
+2 -2
View File
@@ -5,11 +5,11 @@ namespace MTSC.UnitTests
[TestClass]
public class ResourcesTests
{
public static Server.Server server;
public static ServerSide.Server server;
[ClassInitialize]
public static void InitializeServer(TestContext testContext)
{
server = new Server.Server();
server = new ServerSide.Server();
}
[TestMethod]
public void AddAndGetResource()
+22
View File
@@ -0,0 +1,22 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MTSC.ServerSide;
using System.Threading;
namespace MTSC.UnitTests
{
[TestClass]
public class ServerTests
{
[TestMethod]
public void Stop()
{
Server server = new Server();
server.RunAsync();
Thread.Sleep(1000);
Assert.IsTrue(server.Running);
server.Stop();
Thread.Sleep(1000);
Assert.IsFalse(server.Running);
}
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
using MTSC.Server.Resources;
using MTSC.ServerSide.Resources;
namespace MTSC.UnitTests
{
+2 -2
View File
@@ -1,13 +1,13 @@
using MTSC.Common.Http;
using MTSC.Common.Http.RoutingModules;
using MTSC.Server;
using MTSC.ServerSide;
using System.Web;
namespace MTSC.UnitTests
{
class TestQueryModule : HttpRouteBase
{
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server)
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, ServerSide.Server server)
{
var query = HttpUtility.ParseQueryString(request.RequestQuery);
if(query.Count == 2 &&
@@ -1,10 +1,10 @@
using MTSC.Server;
using MTSC.ServerSide;
namespace MTSC.Common.Http.RoutingModules
{
public sealed class Http200Module : HttpRouteBase
{
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server)
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, ServerSide.Server server)
{
return new HttpResponse { StatusCode = HttpMessage.StatusCodes.OK };
}
@@ -1,16 +1,16 @@
using MTSC.Server;
using MTSC.ServerSide;
using System;
namespace MTSC.Common.Http.RoutingModules
{
public abstract class HttpRouteBase
{
public HttpResponse CallHandleRequest(HttpRequest request, ClientData client, Server.Server server)
public HttpResponse CallHandleRequest(HttpRequest request, ClientData client, ServerSide.Server server)
{
return this.HandleRequest(request, client, server);
}
public abstract HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server);
public abstract HttpResponse HandleRequest(HttpRequest request, ClientData client, ServerSide.Server server);
}
public abstract class HttpRouteBase<T> : HttpRouteBase
{
@@ -32,11 +32,11 @@ namespace MTSC.Common.Http.RoutingModules
return this;
}
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server)
public override HttpResponse HandleRequest(HttpRequest request, ClientData client, ServerSide.Server server)
{
return HandleRequest(template.Invoke(request), client, server);
}
public abstract HttpResponse HandleRequest(T request, ClientData client, Server.Server server);
public abstract HttpResponse HandleRequest(T request, ClientData client, ServerSide.Server server);
}
}
@@ -2,8 +2,8 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.Http.ServerModules
{
@@ -17,7 +17,7 @@ namespace MTSC.Common.Http.ServerModules
this.rootFolder = Path.GetFullPath(rootFolder);
}
#region Interface Implementation
bool IHttpModule.HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
bool IHttpModule.HandleRequest(ServerSide.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
{
if(request.Method == HttpMessage.HttpMethods.Get)
{
@@ -66,7 +66,7 @@ namespace MTSC.Common.Http.ServerModules
return false;
}
void IHttpModule.Tick(Server.Server server, HttpHandler handler)
void IHttpModule.Tick(ServerSide.Server server, HttpHandler handler)
{
foreach(KeyValuePair<string, Tuple<byte[], DateTime>> keyValuePair in fileCache)
{
@@ -1,14 +1,14 @@
using System;
using System.Text;
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.Http.ServerModules
{
public sealed class HelloWorldModule : IHttpModule
{
byte[] response = Encoding.ASCII.GetBytes("Hello, World!");
bool IHttpModule.HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
bool IHttpModule.HandleRequest(ServerSide.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
{
if (request.Method == HttpMessage.HttpMethods.Get)
{
@@ -22,7 +22,7 @@ namespace MTSC.Common.Http.ServerModules
return true;
}
void IHttpModule.Tick(Server.Server server, HttpHandler handler)
void IHttpModule.Tick(ServerSide.Server server, HttpHandler handler)
{
}
@@ -1,6 +1,6 @@
using System;
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.Http.ServerModules
{
@@ -17,7 +17,7 @@ namespace MTSC.Common.Http.ServerModules
/// <param name="request"></param>
/// <param name="response"></param>
/// <returns>True so no other handler modifies the response, so the response contains the 404 return status code.</returns>
bool IHttpModule.HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
bool IHttpModule.HandleRequest(ServerSide.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
{
if(request.Method == HttpMessage.HttpMethods.Get)
{
@@ -28,7 +28,7 @@ namespace MTSC.Common.Http.ServerModules
return true;
}
void IHttpModule.Tick(Server.Server server, HttpHandler handler)
void IHttpModule.Tick(ServerSide.Server server, HttpHandler handler)
{
}
@@ -1,6 +1,6 @@
using MTSC.Common.Http.RoutingModules;
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
using System;
using System.Collections.Generic;
using static MTSC.Common.Http.HttpMessage;
@@ -9,19 +9,19 @@ namespace MTSC.Common.Http.ServerModules
{
public sealed class HttpRoutingModule : IHttpModule
{
private static Func<Server.Server, HttpRequest, ClientData, RouteEnablerResponse> alwaysEnabled = (server, request, client) => RouteEnablerResponse.Accept;
private static Func<ServerSide.Server, HttpRequest, ClientData, RouteEnablerResponse> alwaysEnabled = (server, request, client) => RouteEnablerResponse.Accept;
private Dictionary<HttpMethods, Dictionary<string, (HttpRouteBase,
Func<Server.Server, HttpRequest, ClientData, RouteEnablerResponse>)>> moduleDictionary =
Func<ServerSide.Server, HttpRequest, ClientData, RouteEnablerResponse>)>> moduleDictionary =
new Dictionary<HttpMethods, Dictionary<string, (HttpRouteBase,
Func<Server.Server, HttpRequest, ClientData, RouteEnablerResponse>)>>();
Func<ServerSide.Server, HttpRequest, ClientData, RouteEnablerResponse>)>>();
public HttpRoutingModule()
{
foreach (HttpMethods method in (HttpMethods[])Enum.GetValues(typeof(HttpMethods)))
{
moduleDictionary[method] = new Dictionary<string, (HttpRouteBase,
Func<Server.Server, HttpRequest, ClientData, RouteEnablerResponse>)>();
Func<ServerSide.Server, HttpRequest, ClientData, RouteEnablerResponse>)>();
}
}
@@ -38,7 +38,7 @@ namespace MTSC.Common.Http.ServerModules
HttpMethods method,
string uri,
HttpRouteBase routeModule,
Func<Server.Server, HttpRequest, ClientData, RouteEnablerResponse> routeEnabler)
Func<ServerSide.Server, HttpRequest, ClientData, RouteEnablerResponse> routeEnabler)
{
moduleDictionary[method][uri] = (routeModule, routeEnabler);
return this;
@@ -52,7 +52,7 @@ namespace MTSC.Common.Http.ServerModules
return this;
}
bool IHttpModule.HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
bool IHttpModule.HandleRequest(ServerSide.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
{
/*
* Now find if a routing module exists. If not let other handlers try and handle the message.
@@ -89,6 +89,6 @@ namespace MTSC.Common.Http.ServerModules
return false;
}
void IHttpModule.Tick(Server.Server server, HttpHandler handler) { }
void IHttpModule.Tick(ServerSide.Server server, HttpHandler handler) { }
}
}
@@ -1,5 +1,5 @@
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.Http.ServerModules
{
@@ -15,11 +15,11 @@ namespace MTSC.Common.Http.ServerModules
/// <param name="client">Client data.</param>
/// <param name="request">Request message.</param>
/// <returns>True if no other module should handle the received request.</returns>
bool HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response);
bool HandleRequest(ServerSide.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response);
/// <summary>
/// Perform periodic operations.
/// </summary>
/// <param name="handler"></param>
void Tick(Server.Server server, HttpHandler handler);
void Tick(ServerSide.Server server, HttpHandler handler);
}
}
+4 -4
View File
@@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.Text;
using MTSC.Exceptions;
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.Http.ServerModules
{
@@ -81,7 +81,7 @@ namespace MTSC.Common.Http.ServerModules
#endregion
#region Interface Implementation
bool IHttpModule.HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
bool IHttpModule.HandleRequest(ServerSide.Server server, HttpHandler handler, ClientData client, HttpRequest request, ref HttpResponse response)
{
if (request.Method == HttpMessage.HttpMethods.Post &&
request.Headers.ContainsHeader(HttpMessage.EntityHeaders.ContentType))
@@ -111,7 +111,7 @@ namespace MTSC.Common.Http.ServerModules
}
}
void IHttpModule.Tick(Server.Server server, HttpHandler handler)
void IHttpModule.Tick(ServerSide.Server server, HttpHandler handler)
{
}
@@ -1,21 +1,21 @@
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.WebSockets.ServerModules
{
public sealed class BroadcastModule : IWebsocketModule
{
void IWebsocketModule.ConnectionClosed(Server.Server server, WebsocketHandler handler, ClientData client)
void IWebsocketModule.ConnectionClosed(ServerSide.Server server, WebsocketHandler handler, ClientData client)
{
}
void IWebsocketModule.ConnectionInitialized(Server.Server server, WebsocketHandler handler, ClientData client)
void IWebsocketModule.ConnectionInitialized(ServerSide.Server server, WebsocketHandler handler, ClientData client)
{
}
bool IWebsocketModule.HandleReceivedMessage(Server.Server server, WebsocketHandler handler, ClientData client, WebsocketMessage receivedMessage)
bool IWebsocketModule.HandleReceivedMessage(ServerSide.Server server, WebsocketHandler handler, ClientData client, WebsocketMessage receivedMessage)
{
receivedMessage.Masked = false;
//receivedMessage.Opcode = WebsocketMessage.Opcodes.Text;
@@ -1,5 +1,5 @@
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
namespace MTSC.Common.WebSockets.ServerModules
{
@@ -12,18 +12,18 @@ namespace MTSC.Common.WebSockets.ServerModules
}
#endregion
#region Interface Implementation
bool IWebsocketModule.HandleReceivedMessage(Server.Server server, WebsocketHandler handler, ClientData client, WebsocketMessage receivedMessage)
bool IWebsocketModule.HandleReceivedMessage(ServerSide.Server server, WebsocketHandler handler, ClientData client, WebsocketMessage receivedMessage)
{
SendMessage(handler, client, receivedMessage);
return false;
}
void IWebsocketModule.ConnectionClosed(Server.Server server, WebsocketHandler handler, ClientData client)
void IWebsocketModule.ConnectionClosed(ServerSide.Server server, WebsocketHandler handler, ClientData client)
{
}
void IWebsocketModule.ConnectionInitialized(Server.Server server, WebsocketHandler handler, ClientData client)
void IWebsocketModule.ConnectionInitialized(ServerSide.Server server, WebsocketHandler handler, ClientData client)
{
}
@@ -1,5 +1,5 @@
using MTSC.Server;
using MTSC.Server.Handlers;
using MTSC.ServerSide;
using MTSC.ServerSide.Handlers;
using System;
using System.Collections.Generic;
using System.Text;
@@ -14,7 +14,7 @@ namespace MTSC.Common.WebSockets.ServerModules
/// <param name="server">Server object.</param>
/// <param name="handler">Handler currently processing.</param>
/// <param name="client">Client object.</param>
void ConnectionInitialized(Server.Server server, WebsocketHandler handler, ClientData client);
void ConnectionInitialized(ServerSide.Server server, WebsocketHandler handler, ClientData client);
/// <summary>
/// Handle a received message.
/// </summary>
@@ -22,13 +22,13 @@ namespace MTSC.Common.WebSockets.ServerModules
/// <param name="messageBytes">Bytes of the message.</param>
/// <param name="client">Client data.</param>
/// <returns>True if no other module should process the message.</returns>
bool HandleReceivedMessage(Server.Server server, WebsocketHandler handler, ClientData client, WebsocketMessage receivedMessage);
bool HandleReceivedMessage(ServerSide.Server server, WebsocketHandler handler, ClientData client, WebsocketMessage receivedMessage);
/// <summary>
/// Called when a connection has been closed.
/// </summary>
/// <param name="server">Server object.</param>
/// <param name="handler">Handler currently processing.</param>
/// <param name="client">Client object.</param>
void ConnectionClosed(Server.Server server, WebsocketHandler handler, ClientData client);
void ConnectionClosed(ServerSide.Server server, WebsocketHandler handler, ClientData client);
}
}
@@ -1,6 +1,6 @@
using System.Text;
namespace MTSC.Server.Handlers
namespace MTSC.ServerSide.Handlers
{
/// <summary>
/// Broadcast handler.
@@ -4,7 +4,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace MTSC.Server.Handlers
namespace MTSC.ServerSide.Handlers
{
/// <summary>
/// Handler that encrypts the communication.
@@ -5,7 +5,7 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
namespace MTSC.Server.Handlers
namespace MTSC.ServerSide.Handlers
{
/// <summary>
/// Handler for handling server http requests.
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
namespace MTSC.Server.Handlers
namespace MTSC.ServerSide.Handlers
{
/// <summary>
/// Interface for communication handlers.
@@ -7,7 +7,7 @@ using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace MTSC.Server.Handlers
namespace MTSC.ServerSide.Handlers
{
public sealed class WebsocketHandler : IHandler
{
@@ -1,4 +1,4 @@
namespace MTSC.Server.Resources
namespace MTSC.ServerSide.Resources
{
public interface IResource
{
@@ -1,8 +1,8 @@
using MTSC.Exceptions;
using MTSC.Logging;
using MTSC.Server.Handlers;
using MTSC.Server.Resources;
using MTSC.Server.UsageMonitors;
using MTSC.ServerSide.Handlers;
using MTSC.ServerSide.Resources;
using MTSC.ServerSide.UsageMonitors;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -13,7 +13,7 @@ using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
namespace MTSC.Server
namespace MTSC.ServerSide
{
/// <summary>
/// Basic server class to handle TCP connections.
@@ -56,7 +56,7 @@ namespace MTSC.Server
/// <summary>
/// Returns the state of the server.
/// </summary>
public bool Running { get => running; }
public bool Running { get => listener != null; }
public bool RequestClientCertificate { get; set; } = true;
/// <summary>
/// List of clients currently connected to the server.
@@ -512,6 +512,8 @@ namespace MTSC.Server
}
}
}
listener.Stop();
listener = null;
}
/// <summary>
/// Runs the server async.
@@ -3,7 +3,7 @@ using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace MTSC.Server.UsageMonitors
namespace MTSC.ServerSide.UsageMonitors
{
/// <summary>
/// Implementation of <see cref="IServerUsageMonitor"/> that limits CPU usage to a given value.
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace MTSC.Server.UsageMonitors
namespace MTSC.ServerSide.UsageMonitors
{
/// <summary>
/// Interface for server usage monitors.
@@ -1,7 +1,7 @@
using System;
using System.Threading;
namespace MTSC.Server.UsageMonitors
namespace MTSC.ServerSide.UsageMonitors
{
/// <summary>
/// Implementation of <see cref="IServerUsageMonitor"/> that enforces a specified tickrate.