Exemple #1
0
        /// <summary>
        /// This is our async callback, used to accept TCP clients. The code is quite a ride!
        /// </summary>
        /// <param name="ar"></param>
        private async void EndAccept(IAsyncResult ar)
        {
            var listener = (TcpListener)ar.AsyncState;

            if (listener == null)
            {
                return;
            }
            if (Running)
            {
                listener.BeginAcceptTcpClient(EndAccept, listener);
            }
            try
            {
                var client  = listener.EndAcceptTcpClient(ar);
                var address = (client.Client.RemoteEndPoint as IPEndPoint).Address.ToString();
                if (QEDetector.IsAttacking(((IPEndPoint)(client.Client.RemoteEndPoint)).Address))
                {
                    if (!AttackerAddresses.Contains(address))
                    {
                        ApiServer.Push(
                            $"Under denial of service attack from: {address}! The address has been booted from accessing the HTTP server, for 5 minutes. Please take action!",
                            "-HIGHEST PRIORITY/CRITICAL-", Structures.MessageFlag.ConsoleLogMessage);
                        AttackerAddresses.Add(address);
                    }
                    return;
                }
                var ns = SelectProtocol(client);
                using (var reader = new StreamReader(ns))
                {
                    var strData = await ReaderExtensions.ReadLineSizedBuffered(reader, ReadSize).ConfigureAwait(false);

                    if (strData == null)
                    {
                        return;
                    }
                    var startPos = 0;
                    if (strData.Substring(0, 3) != "GET")
                    {
                        //only GET is allowed.
                        await WriteDocument(DocumentTypeNotSupported, "text/html", ns,
                                            status : StatusCodes.NotImplemented501).ConfigureAwait(false);

                        await ns.DisposeAsync().ConfigureAwait(false);

                        client.Dispose();
                        return;
                    }

                    // Extract the request.
                    startPos = strData.IndexOf("HTTP", 1, StringComparison.InvariantCultureIgnoreCase);
                    var version = strData.Substring(startPos, 8);
                    var request = strData.Substring(0, startPos - 1);
                    request = request.Replace("\\", "/");
                    if ((request.IndexOf(".", StringComparison.InvariantCultureIgnoreCase) < 1) &&
                        (!request.EndsWith("/")))
                    {
                        request += "/";
                    }

                    startPos = request.LastIndexOf("/", StringComparison.CurrentCultureIgnoreCase) + 1;
                    var file      = request.Substring(startPos);
                    var directory = request.Substring(request.IndexOf("/", StringComparison.InvariantCultureIgnoreCase), request.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase) - 3);
                    await Process(directory, file, version, address, ns).ConfigureAwait(false);
                }
                await ns.DisposeAsync().ConfigureAwait(false);

                client.Dispose();
            }
            catch (Exception ex)
            {
                if (!this.Running)
                {
                    return;
                }
                MainClass.LogManager.LogError($"{ex.Message}", Shared.ErrorLocation.HttpServer);
            }
        }