Common Lisp/External libraries/Hunchentoot
Hunchentoot is a web application server written in Common Lisp.
Quick start
Installing with ASDF
Installing Hunchentoot on ASDF-enabled systems. The next command installs Hunchentoot and all dependencies.
(require 'asdf-install) (asdf-install:install 'hunchentoot)
Generating a simple Web page
(asdf:oos 'asdf:load-op :hunchentoot) (defpackage :testserv (:use :cl :hunchentoot) (:export :start-server)) (in-package :testserv) ;; Add a simple prefix dispatcher to the *dispatch-table* (setq *dispatch-table* `(,(create-prefix-dispatcher "/hello-world" 'hello-page))) ;; Handler functions either return generated Web pages as strings, ;; or write to the output stream returned by write-headers (defun hello-page () "<html><body>Hello World!</body></html>") (defun start-server (&key (port 4242)) (start (make-instance 'easy-acceptor :port port)))
Start the server:
(testserv:start-server :port 4242)
The generated image is available on http://localhost:4242/hello-world.
Serving dynamic graphics
This example shows how to generate PNG images with Vecto[1] and serve them with Hunchentoot.
First step: load external dependencies
(asdf:oos 'asdf:load-op :hunchentoot) (asdf:oos 'asdf:load-op :vecto)
Second step: declare a package
(defpackage :testserv (:use :cl :vecto :hunchentoot) (:export :start-server)) (in-package :testserv)
Add a simple prefix dispatcher to the *dispatch-table*:
(setq *dispatch-table* `(,(create-prefix-dispatcher "/img" 'img-page)))
The img-page function expects HTTP parameter height containing an integer value and generates a PNG image height pixels height. If the parameter is not specified a default value of 150 is used.
(defun img-page () (setf (content-type*) "image/png") (let ((out (send-headers)) ; send-headers returns the output flexi-stream (bar-height (or (and (parameter "height") (parse-integer (parameter "height"))) 150))) (with-canvas (:width 10 :height bar-height) (rectangle 0 0 10 bar-height) (set-gradient-fill 0 0 0 1 1 1 0 bar-height 1 0 0 1) (fill-and-stroke) (save-png-stream out)))) ; write the image data to the output stream obtained from send-headers
Start the server:
(testserv:start-server :port 4242)
The generated image is available on http://localhost:4242/img. Try to change the height: http://localhost:4242/img?height=350
See also
- http://weitz.de/hunchentoot/ — Hunchentoot homepage
- http://www.cliki.net/hunchentoot — Common Lisp Wiki entry for Hunchentoot
- LispCast: Writing a simple Reddit clone in Common Lisp