Add normalize-path middleware

This commit is contained in:
Akira Tempaku 2024-04-13 02:28:41 +09:00
parent f721c3426d
commit 0ad8c14e10
5 changed files with 45 additions and 14 deletions

1
qlfile
View file

@ -3,3 +3,4 @@ ql fiveam
ql cl-jingle
git piccolo https://github.com/skyizwhite/piccolo.git
git ningle-fbr https://github.com/skyizwhite/ningle-fbr.git
ql cl-ppcre

View file

@ -22,3 +22,7 @@
(:class qlot/source/git:source-git
:initargs (:remote-url "https://github.com/skyizwhite/ningle-fbr.git")
:version "git-438030b0b89dc706c37932616e6bf82d0416ea26"))
("cl-ppcre" .
(:class qlot/source/ql:source-ql
:initargs (:%version :latest)
:version "ql-2023-10-21"))

View file

@ -6,7 +6,7 @@
(:local-nicknames (#:pi #:piccolo))
(:local-nicknames (#:view #:hp/view))
(:local-nicknames (#:cmp #:hp/components/**/*))
(:local-nicknames (#:mw #:hp/middleware))
(:local-nicknames (#:mw #:hp/middlewares/*))
(:export #:start
#:stop
#:update))
@ -21,18 +21,26 @@
:title "404 Not Found"
:description "お探しのページは見つかりませんでした。"))
(defun update ()
(jg:clear-middlewares *app*)
(jg:install-middleware *app* mw:*public-files*)
(jg:static-path *app* "/scripts/" "src/scripts/")
(jg:static-path *app* "/styles/" "src/styles/")
(fbr:assign-routes *app*
:system "hp"
:directory "src/routes"))
(update)
(defun start ()
(jg:start *app*))
(defun stop ()
(jg:stop *app*))
(defun setup ()
(jg:clear-middlewares *app*)
(jg:clear-routing-rules *app*)
(fbr:assign-routes *app*
:system "hp"
:directory "src/routes")
(jg:static-path *app* "/scripts/" "src/scripts/")
(jg:static-path *app* "/styles/" "src/styles/")
(jg:install-middleware *app* mw:*public-files*)
(jg:install-middleware *app* mw:*normalize-path*))
(defun update ()
(stop)
(setup)
(start))
(setup)

View file

@ -0,0 +1,19 @@
(defpackage #:hp/middlewares/normalize-path
(:use #:cl)
(:local-nicknames (#:re #:cl-ppcre))
(:export #:*normalize-path*))
(in-package #:hp/middlewares/normalize-path)
(defun has-trailing-slash-p (path)
(and (not (string= path "/")) (re:scan "\/$" path)))
(defun remove-trailing-slash (path)
(re:regex-replace "\/$" path ""))
(defparameter *normalize-path*
(lambda (app)
(lambda (env)
(let ((path (getf env :request-uri)))
(if (has-trailing-slash-p path)
`(308 (:location ,(remove-trailing-slash path)))
(funcall app env))))))

View file

@ -1,10 +1,9 @@
(defpackage #:hp/middleware
(defpackage #:hp/middlewares/public-files
(:use #:cl)
(:local-nicknames (#:jg #:jingle))
(:import-from #:lack.middleware.static
#:*lack-middleware-static*)
(:export #:*public-files*))
(in-package #:hp/middleware)
(in-package #:hp/middlewares/public-files)
(defun exist-public-file-p (path)
(let ((pathname (probe-file (concatenate 'string "public" path))))