(defpackage "MY-ARANEIDA-EXAMPLE"
(:use "CL" "ARANEIDA"))
(in-package :my-araneida-example)
(eval-when (:compile-toplevel :load-toplevel :execute)
#+nil (pushnew :araneida-uses-proxy *features*)
#+araneida-threads (pushnew :araneida-uses-threads *features*))
#+sbcl
(defun my-fqdn ()
(sb-bsd-sockets:host-ent-name
(sb-bsd-sockets:get-host-by-name (machine-instance))))
(defvar *demo-url*
(make-url :scheme "http" :host "localhost" :port
#+araneida-uses-proxy 80
#-araneida-uses-proxy 8000))
#-araneida-uses-proxy
(defvar *listener*
(make-instance #+araneida-uses-threads 'threaded-http-listener
#-araneida-uses-threads 'serve-event-http-listener
:port (url-port *demo-url*)))
#+araneida-uses-proxy
(defvar *listener*
(let ((fwd-url (copy-url *demo-url*)))
(setf (url-port fwd-url) (+ 1024 (url-port *demo-url*)))
(make-instance #+araneida-uses-threads 'threaded-reverse-proxy-listener
#-araneida-uses-threads 'serve-event-reverse-proxy-listener
:translations
`((,(urlstring *demo-url*) ,(urlstring fwd-url)))
:address #(0 0 0 0)
:port (url-port fwd-url))))
(defclass hello-handler (handler)
((hits :initform 0 :accessor hello-hits)))
(defclass reset-handler (handler)
((hello :initarg :hello :initform (error "missing required argument")
:reader reset-hello)))
(defmethod handle-request-response ((handler hello-handler) method request)
(let ((hits (incf (hello-hits handler))))
(when (zerop (mod hits 7))
(signal 'http-payment-required
:message "Game Over. Insert coin"))
(request-send-headers request)
(html-stream
(request-stream request)
`(html (head (title "Hello world"))
(body (h1 "Hello")
,@(when (zerop (mod hits 4)) (list (/ hits 0)))
(p "There have been " ,hits
" accesses to this page since the last "
((a :href "reset") "reset")))))))
(defmethod handle-request-response ((handler reset-handler) method request)
(let ((hello (reset-hello handler)))
(setf (hello-hits hello) 0)
(request-redirect request "hello")
t))
(let ((hello (make-instance 'hello-handler)))
(install-handler (http-listener-handler *listener*)
hello
(urlstring (merge-url *demo-url* "/hello")) t)
(install-handler (http-listener-handler *listener*)
(make-instance 'reset-handler :hello hello)
(urlstring (merge-url *demo-url* "/reset")) t))
(let* ((pn (asdf:component-pathname (asdf::find-system 'araneida))))
(install-handler (http-listener-handler *listener*)
(make-instance 'static-file-handler :pathname pn)
(urlstring *demo-url*) nil))
#+araneida-uses-proxy
(with-open-file (o "/tmp/araneida-apache.cf" :direction :output)
(apache-conf-segment *listener* o))
|