public HttpResponse Handle(HttpRequest request)
        {
            var path = Path.Combine(_baseDirectory, request.Url.TrimStart('/'));

            var fileInfo = new FileInfo(path);

            if (!fileInfo.FullName.StartsWith(_baseDirectory))
            {
                return new HttpResponse(HttpStatusCode.Forbidden);
            }

            if (File.Exists(path))
            {
                var response = new HttpResponse(HttpStatusCode.OK, File.ReadAllBytes(path));

                var fileExtension = Path.GetExtension(path);

                if (_mimeTypes.ContainsKey(fileExtension))
                {
                    response.AddHeader("Content-Type", _mimeTypes[fileExtension]);
                }

                return response;
            }

            if (_next != null)
            {
                return _next.Handle(request);
            }

            return new HttpResponse(HttpStatusCode.NotFound);
        }
        public HttpResponse Handle(HttpRequest request)
        {
            var routeParts = request.Url.Split('/').Where(x => !string.IsNullOrWhiteSpace(x)).ToList();

            if (!routeParts.Any())
                return new HttpResponse(HttpStatusCode.NotFound);

            var controllerName = $"{routeParts[0]}Controller";

            var controllerType = _controllerAssembly
                .GetTypes()
                .FirstOrDefault(x => x.Name.Equals(controllerName, StringComparison.InvariantCultureIgnoreCase));

            var controllerMethod = controllerType?
                .GetMethods()
                .FirstOrDefault(x => request.Method.Equals(x.Name, StringComparison.InvariantCultureIgnoreCase));

            if (controllerType == null || controllerMethod == null)
            {
                return new HttpResponse(HttpStatusCode.NotFound);
            }

            var controllerInstance = Activator.CreateInstance(controllerType);
            return (HttpResponse)controllerMethod.Invoke(controllerInstance, null);
        }