commit 6be18fd8a742c248248813b3b6dd425e5282e987
parent a2a8a2ee6fdcd1c70dcb076452c5083cbbac3858
Author: Tomas Hlavaty <tom@logand.com>
Date: Sun, 13 Dec 2015 12:20:31 +0100
refactoring
Diffstat:
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/demo-webserver.lisp b/demo-webserver.lisp
@@ -25,6 +25,11 @@
(in-package :rw.demo.webserver)
+;; TODO vhosting
+;; TODO redirect, e.g. www, picowiki
+;; TODO proxy, e.g. ondoc, zappel, counter
+;; TODO logging?
+
(defparameter *root* #p"/nix/store/l549rl2lmyk7dvsrv4mrrwgwbswf8q6l-logand-website/share/logandWebsite/data/")
(defun part-reader (query)
@@ -37,20 +42,28 @@
:nothing))
(rw:skip r '(#\/)))))))
-(defun query-pathname (query)
+(defun query-pathname (query default-name default-type)
(let* ((tail (rw:till (rw:peek-reader (part-reader query))))
(head (pop tail)))
(merge-pathnames
(make-pathname :directory (cons :relative (nreverse tail))
:name (if (eq :nothing head)
- "index"
+ default-name
(pathname-name head))
:type (if (eq :nothing head)
- "html"
+ default-type
(pathname-type head)))
*root*)))
-(defun query-file (query)
+(defun readable-file-p (pathname)
+ (let ((f (probe-file pathname)))
+ (when f
+ (ignore-errors
+ (with-open-file (s f :if-does-not-exist nil)
+ (listen s) ;; dir throws
+ f)))))
+
+(defun query-file (query default-name default-type)
(let ((q (rw:till (rw:peek-reader (rw:reader query)) '(#\?))))
(when (every (lambda (c)
(or (char<= #\A c #\Z)
@@ -58,12 +71,7 @@
(char<= #\0 c #\9)
(member c '(#\/ #\. #\- #\_))))
q)
- (let ((f (probe-file (query-pathname q))))
- (when f
- (ignore-errors
- (with-open-file (s f :if-does-not-exist nil)
- (listen s) ;; dir throws
- f)))))))
+ (readable-file-p (query-pathname q default-name default-type)))))
(defun content-type (pathname)
(or (cdr (assoc (pathname-type pathname) rw.http:*mime-types* :test #'equalp))
@@ -75,7 +83,9 @@
;;(:read (rw:till (rw:peek-reader stream)))
(:write
(or (when (member method '(:get :head))
- (let ((f (query-file query)))
+ (let ((f (or (query-file query "index" "html")
+ #+nil(query-file query "index" "htm")
+ #+nil(query-file query "README" nil))))
(when f
`(:http-1.0
:code 200