- &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" (format-string ,fmt))
- (dolist (,hdr ,headers)
- (write-header-line (car ,hdr) (cdr ,hdr)))
- (unless ,precomp
- (write-string "end" *modlisp-socket*)
- (write-char #\NewLine *modlisp-socket*))
- (setq ,outstr
- (with-output-to-string (,stream)
- (let ((*modlisp-socket* (if ,precomp
- ,stream
- *modlisp-socket*)))
- (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" *modlisp-socket*)
- (write-char #\NewLine *modlisp-socket*)
- (write-string ,outstr *modlisp-socket*)
- (finish-output *modlisp-socket*)
- (setq *close-modlisp-socket* nil))
- (t
- (finish-output *modlisp-socket*)
- (setq *close-modlisp-socket* t)))
- ,result)))