Cyrus,
in the code sample below, is it your intention to discard all headers sent by the CGI program? If not, I'd suggest that you just add them all to the list of outgoing headers. Also, you may want to use a COPY-STREAM function (like http://bknr.net/trac/browser/trunk/bknr/datastore/src/utils/utils.lisp#L189) instead of copying the data character wise for efficiency and readability.
(let* ((process (sb-ext::run-program path nil :output :stream :environment env)) (in (sb-ext:process-output process))) (loop for line = (chung:read-line* in) until (equal line "") do (destructuring-bind (key val) (ppcre:split ":\s*" line) (setf (hunchentoot:header-out key) val))) (copy-stream in (flexi-streams:make-flexi-stream (tbnl:send-headers) :external-format tbnl::+latin-1+) :element-type 'character))
-Hans
On Tue, Jul 22, 2008 at 04:04, Cyrus Harmon ch-tbnl@bobobeach.com wrote:
Falling squarely in the more than one way to skin a cat, perhaps it's easier to just read off the CGI headers and DTRT WRT to those headers and then send the output of the CGI to the tbnl output-stream.
(let* ((process (sb-ext::run-program path nil :output :stream :environment env)) (in (sb-ext:process-output process))) (let ((headers (loop for line = (chunga:read-line* in) until (equal line "") collect (destructuring-bind (key val) (ppcre:split ": " line) (cons (chunga:as-keyword key) val))))) (let ((type-cons (assoc :content-type headers))) (when type-cons (setf (tbnl:content-type) (cdr type-cons))))) (let ((out (flexi-streams:make-flexi-stream (tbnl:send-headers) :external-format tbnl::+latin-1+))) (do ((c (read-char in) (read-char in))) ((eq c 'eof)) (write-char c out))))
This works well enough for the git CGI interface to sit behind (an unhacked) hunchentoot and hunchentoot-cgi as can be seen here:
http://git.cyrusharmon.org/cgi-bin/gitweb.cgi?p=hunchentoot-cgi.git
thanks for prodding me to think about this some more...
cyrus
On Jul 20, 2008, at 11:44 PM, Edi Weitz wrote:
On Mon, 21 Jul 2008 07:54:51 +0200, "Hans Hübner" hans@huebner.org wrote:
Why not make the flag to suppress sending the content type and terminating the header be an argument to START-OUTPUT? I don't think that adding more special variables for no good reason would be so nice. It may just be me, though.
Fine with me.
What's so special about the content type, though? Do you actually want /any/ headers to be sent or any processing to be done? _______________________________________________ tbnl-devel site list tbnl-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/tbnl-devel
tbnl-devel site list tbnl-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/tbnl-devel