/// <summary> /// Runs the http server inside a async task. /// </summary> /// <returns></returns> public async Task RunServer() { TcpListener tcpListener = new TcpListener(IPAddress.Any, _Port); tcpListener.Start(); byte[] buffer = new byte[1024]; _Stop = false; while (!_Stop) { TcpClient client = tcpListener.AcceptTcpClient(); NetworkStream stream = client.GetStream(); int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); string received = Encoding.UTF8.GetString(buffer, 0, bytesRead); string baseUrlEncoded = received.Split(new string[] { "GET " }, StringSplitOptions.None)[1].Split(new string[] { " HTTP" }, StringSplitOptions.None)[0]; string baseUrlDecoded = WebUtility.UrlDecode(baseUrlEncoded); string baseUrl = CheckIfBaseUrl(baseUrlDecoded); string customId = CheckIfCustomIdIsSet(baseUrl, baseUrlDecoded); if (received.Contains("Sec-WebSocket-Key:") && baseUrl != null) { string webSocketKey = received.Split(new string[] { "Sec-WebSocket-Key:" }, StringSplitOptions.None)[1].Split(new string[] { "\r\n" }, StringSplitOptions.None)[0].Trim(); byte[] acceptMessage = GenerateAcceptResponse(webSocketKey); stream.Write(acceptMessage, 0, acceptMessage.Length); if (customId == null) { _WebsocketHandler.StartConnection(client, Guid.NewGuid().ToString("N"), baseUrlDecoded); } else { _WebsocketHandler.StartConnection(client, customId, baseUrlDecoded); } } else { string headerToSendBack = "HTTP/1.1 403 Forbidden" + "\r\n\r\n"; byte[] msg = Encoding.ASCII.GetBytes(headerToSendBack); stream.Write(msg, 0, msg.Length); } } }