private void Server_RequestReceived(object sender, HttpRequestEventArgs e)
        {
            WriteLine($"Raw URL: {e.Request.RawUrl}");
            WriteLine($"URL: {e.Request.Url}");
            WriteLine($"Path: {e.Request.Path}");

            string ErrorMessage  = "";
            string DirectoryName = e.Request.Directory();
            string FileName      = e.Request.FileName();
            string Path          = e.Request.Path;

            string [] splitPath = Path.Split('/');

            if (!Directory.Exists(ServerDirectory))
            {
                ErrorMessage = "<H2>Error!! Requested Directory does not exists</H2><Br>";
                WriteLine("HTTP folder not found: " + ServerDirectory + DirectoryName);

                BuildHeader(e, 404, "404 Not Found");

                e.Response.OutputStream.WriteString(ErrorMessage);
                return;
            }

            if (e.Request.Path.EndsWith("/"))
            {
                // we need to find the default file

                FileName = DefaultFileName( );
            }

            MemoryStream virtualFileStream = null;

            DynamicFileRequestedEventArgs fe = new DynamicFileRequestedEventArgs(e);

            if (DynamicFileRequestedEvent != null)
            {
                virtualFileStream = DynamicFileRequestedEvent(this, fe);
            }

            if (virtualFileStream != null)
            {
                // send virtual file
                e.Response.ContentType
                    = mimeTypeMappings.TryGetValue(
                          System.IO.Path.GetExtension(fe.FileName), out string mime)
                        ? mime : "application/octet-stream";

                e.Response.CacheControl = "no-cache";

                virtualFileStream.CopyTo(e.Response.OutputStream);

                return;
            }


            string filePath =
                DirectoryName == "/" ? System.IO.Path.Combine(ServerDirectory, FileName) :
                System.IO.Path.Combine(ServerDirectory, DirectoryName, FileName);

            if (FileName.EndsWith(".py"))
            {
                ScriptProcessor.ProcessScriptFile(filePath, e);
                return;
            }
            else
            {
                // look for a static file


                if (File.Exists(filePath))
                {
                    try
                    {
                        // set mime type

                        e.Response.ContentType
                            = mimeTypeMappings.TryGetValue(
                                  System.IO.Path.GetExtension(FileName), out string mime)
                                ? mime : "application/octet-stream";

                        if (mime.Contains("image") || mime.Contains("javascript") || mime.Contains("css"))
                        {
                            // allow images, css and javascript to cache
                            e.Response.CacheControl = "max-age=36000";
                        }
                        else
                        {
                            e.Response.CacheControl = "no-cache";
                        }

                        Stream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);

                        fs.CopyTo(e.Response.OutputStream);

                        fs.Close( );
                        return;
                    }
                    catch
                    {
                    }
                }
                else
                {
                    // return 404
                    ErrorMessage = "<H2>404 Error! File Does Not Exist...</H2>";
                    BuildHeader(e, 404, "404 Not Found");
                    e.Response.OutputStream.WriteString(ErrorMessage);
                }
            }
        }