From 887818ec9bcfcf288ed932a566ed6219f5b9f212 Mon Sep 17 00:00:00 2001 From: colin Date: Sat, 11 May 2024 12:05:54 -0700 Subject: Add: kitchensink example --- examples/dice-roller.lisp | 2 +- examples/kitchensink.lisp | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 examples/kitchensink.lisp (limited to 'examples') diff --git a/examples/dice-roller.lisp b/examples/dice-roller.lisp index 3cd6ac3..d87faf4 100644 --- a/examples/dice-roller.lisp +++ b/examples/dice-roller.lisp @@ -27,7 +27,7 @@ (:extractors (:rolls parse-integer) (:sides parse-integer)) (:content-type . "text/plain")) -(defmethod handle ((req roller)) +(defmethod wknd::handle ((req roller)) (with-slots (rolls sides) req (format nil "~ad~a ... rolled a ~a" rolls sides diff --git a/examples/kitchensink.lisp b/examples/kitchensink.lisp new file mode 100644 index 0000000..788334d --- /dev/null +++ b/examples/kitchensink.lisp @@ -0,0 +1,87 @@ +(defpackage #:kitchensink + (:use #:cl) + (:local-nicknames + (#:wknd #:weekend))) + +(in-package #:kitchensink) + +(defparameter +fname+ "([^/]+)" + "Match any ole character except /") + +(defclass file () + ((name + :reader name + :initarg :name + :initform (wknd::slot-required 'file 'name))) + (:documentation "Servies files in the weekend/examples dir.") + (:metaclass wknd::endpoint) + (:method . :get) + (:route-parts "file" +fname+) + (:extractors :name)) + +(defun file-in-examples-dir (name) + (merge-pathnames + name + (asdf:system-relative-pathname 'weekend "examples/"))) + +(defmethod wknd::handle ((req file)) + (let ((file (file-in-examples-dir (name req)))) + (unless (uiop:file-exists-p file) + (wknd::not-found req)) + (wknd:handle-static-file + file + (or (wknd:mime-type file) "text/plain")))) + +(defvar *identified-persons* nil) + +(defclass identify-form () + () + (:documentation "Page to serve an identify form") + (:metaclass wknd::endpoint) + (:method . :get) + (:route-parts "identify") + (:content-type . "text/html")) + +(defmethod wknd::handle ((req identify-form)) + " + + +
+ +
+ +") + +(defclass hello () + () + (:documentation "A Page that just says hello.") + (:metaclass wknd:endpoint) + (:method . :get) + (:route-parts "hello") + (:content-type . "text/html")) + +(defmethod wknd:authenticate ((req hello)) + (or (plusp (length (wknd:get-cookie "name"))) + (wknd:endpoint-redirect 'identify-form))) + +(defmethod wknd::handle ((req hello)) + (with-output-to-string (*standard-output*) + (princ "") + (format t "

hello ~a

" (wknd:get-cookie "name")) + (princ ""))) + +(defclass identify () + ((name :reader name :initarg :name :type string)) + (:metaclass wknd::endpoint) + (:method . :post) + (:route-parts "identify")) + +(defmethod wknd::handle ((req identify)) + (wknd:set-cookie "name" :value (name req)) + (wknd:endpoint-redirect 'hello)) + +(defvar *server* (make-instance 'hunchentoot:easy-acceptor + :port 8888)) + +(hunchentoot:start *server*) + -- cgit v1.2.3