+
+
+(defmacro with-wol-page ((req ent
+ &key (format :html) (precompute t) headers)
+ &body body)
+ (let ((fmt (gensym "FMT-"))
+ (precomp (gensym "PRE-"))
+ (result (gensym "RES-"))
+ (outstr (gensym "STR-"))
+ (stream (gensym "STRM-"))
+ (hdr (gensym "HDR-")))
+ `(let ((,fmt ,format)
+ (,precomp ,precompute)
+ ,result ,outstr ,stream)
+ (declare (ignorable ,stream))
+ (write-header-line "Status" "200 OK")
+ (write-header-line "Content-Type" (ml::format-string ,fmt))
+ (dolist (,hdr ,headers)
+ (write-header-line (car ,hdr) (cdr ,hdr)))
+ (unless ,precomp
+ (write-string "end" *wol-stream*)
+ (write-char #\NewLine *wol-stream*))
+ (setq ,outstr
+ (with-output-to-string (,stream)
+ (let ((*html-stream* (if ,precomp
+ ,stream
+ *wol-stream*))
+ (*wol-stream* (if ,precomp
+ ,stream
+ *wol-stream*)))
+ (setq ,result (progn ,@body)))))
+ (cond
+ (,precomp
+ (write-header-line "Content-Length"
+ (write-to-string (length ,outstr)))
+ (write-header-line "Keep-Socket" "1")
+ (write-header-line "Connection" "Keep-Alive")
+ (write-string "end" *wol-stream*)
+ (write-char #\NewLine *wol-stream*)
+ (write-string ,outstr *wol-stream*)
+ (finish-output *wol-stream*)
+ (setq *close-modlisp-socket* nil))
+ (t
+ (finish-output *wol-stream*)
+ (setq *close-modlisp-socket* t)))
+ ,result)))
+
+
+(defun no-url-handler (req ent)
+ (with-wol-page (req ent)
+ (html
+ (:html
+ (:head
+ (:title "404 - NotFound"))
+ (:body
+ (:h1 "Not Found")
+ (:p "The request for "
+ (:b (:write-string (request-uri req)))
+ " was not found on this server.")
+ (:hr)
+ (:div (:i "WOL "
+ (:write-string (wol-version-string)))))))))