diff --git a/hunchenhelpers.asd b/hunchenhelpers.asd index 2d99b0c..0a85e79 100644 --- a/hunchenhelpers.asd +++ b/hunchenhelpers.asd @@ -1,8 +1,8 @@ (asdf:defsystem #:hunchenhelpers - :description "A helper library to simplify hunchentoot" + :description "A helper library for hunchentoot" :author "Manx (boku@plum.moe)" :license "X11/MIT" - :version "0.1.0" + :version "1.0.0" :serial t :depends-on (:hunchentoot) :Components ((:file "package") diff --git a/main.lisp b/main.lisp index 2b4f04d..0fb4eb7 100644 --- a/main.lisp +++ b/main.lisp @@ -1,26 +1,63 @@ -(in-package :hunchenhelpers) +(in-package #:hunchenhelpers) -(defun hunchenhost (func uri path &optional content-type) - (let ((thing (if (null content-type) - (funcall func uri path) - (funcall func uri path content-type)))) - (push thing tbnl:*dispatch-table*))) +(defclass acceptor (hunchentoot:easy-acceptor) + () + (:default-initargs + :address "127.0.0.1" + :error-template-directory "/var/www/err/" + :message-log-destination nil + :access-log-destination nil) + (:documentation "Because I hate writing code")) + +(defmacro hunchenhost (func uri path &optional content-type) + `(push (,func ,uri ,path (or ,content-type ,tbnl:*default-content-type*)) tbnl:*dispatch-table*)) (defun host-file (uri path &optional content-type) - (hunchenhost 'tbnl:create-static-file-dispatcher-and-handler uri path content-type)) + (hunchenhost tbnl:create-static-file-dispatcher-and-handler uri path content-type)) (defun host-dir (uri path &optional content-type) - (hunchenhost 'tbnl:create-folder-dispatcher-and-handler uri path content-type)) + (hunchenhost tbnl:create-folder-dispatcher-and-handler uri path content-type)) + +;; Stolen from stackoverflow +(defmacro method-path (methods path) + "Expands to a predicate the returns true of the Hunchtoot request +has a SCRIPT-NAME matching the PATH and METHOD in the list of METHODS. +You may pass a single method as a designator for the list containing +only that method." + (declare + (type (or keyword list) methods) + (type string path)) + `(lambda (request) + (and (member (hunchentoot:request-method* request) + ,(if (keywordp methods) + `'(,methods) + `',methods)) + (string= (hunchentoot:script-name* request) + ,path)))) -(defmacro handle (method uri content-type params &body body) +(defmacro handle (request params &body body) "Creates an easy handles for a specific HTTP request method. If the method provided sent from the client isn't correct, return 404 and stop processing the request. -(handle :get (uri-fun :uri \"/path/to/page\"/) @content-type (args) (body))" - `(tbnl:define-easy-handler ,uri ,params - (unless (eq ,method (tbnl:request-method*)) - (setf (tbnl:return-code*) tbnl:+http-method-not-allowed+) - (tbnl:abort-request-handler)) - (setf (tbnl:content-type* tbnl:*reply*) ,content-type) - ,@body)) +`request' should have a symbol `name', keyword or list of keywords +`method' and a string `uri'. One may also pass keyword arguments +`content-type', a string of the content type returned and list of +`acceptor', hunchentoot acceptor class that should listen for this +handler. + +`params' are the request parameters of the client + +`body' is what is evaluated and returned to the client" + (destructuring-bind (name method uri &optional content-type) + request + `(tbnl:define-easy-handler (,name :uri (method-path ,method ,uri)) + ,params + (when ,content-type + (setf (tbnl:content-type* tbnl:*reply*) ,content-type)) + ,@body))) + +(export '(host-file + host-dir + handle + acceptor)) diff --git a/package.lisp b/package.lisp index be2bcfc..b2af120 100644 --- a/package.lisp +++ b/package.lisp @@ -1,6 +1,3 @@ (defpackage #:hunchenhelpers (:nicknames :henh) - (:use :cl :hunchentoot) - (:export - :host-file :host-dir - :handle)) + (:use #:cl))