[hunchentoot-devel] hunchentoot-cgi and the new hunchentoot regime

Hans Hübner hans at huebner.org
Tue Jul 22 05:33:07 UTC 2008


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 at 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 at 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 at common-lisp.net
>> http://common-lisp.net/mailman/listinfo/tbnl-devel
>
> _______________________________________________
> tbnl-devel site list
> tbnl-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/tbnl-devel
>



More information about the Tbnl-devel mailing list