[tbnl-devel] send-headers and slow page generation

Hi, I'd like to use TBNL for a web application that have a really slow page generation rate. At first I thought that send-headers was the solution: write the page header and navigation before launching the slow content generation and then write the content as it is generated. I made this small example (using cl-who): (defun test-page () (with-html-output (*standard-output* (send-headers) :prologue t :indent t) (:html (:body (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 0)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 1)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 2)) (finish-output *standard-output*) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 3)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 4)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 5)))))) Running it (without the call to send-headers) in my REPL have the desired result: each part is printer before the next call to sleep. On the other hand, when I try it live with TBNL I have to wait for the whole page to be generated. Maybe is misinterpreted the documentation. Is it possible to write partial pages to the client stream with TBNL? I'm using apache2 with the latest mod_lisp2 and TBNL 0.9.9 on a Debian Etch system. -- Yannick Gingras

On Sun, 14 May 2006 11:52:51 -0400, Yannick Gingras <ygingras@ygingras.net> wrote:
I'd like to use TBNL for a web application that have a really slow page generation rate. At first I thought that send-headers was the solution: write the page header and navigation before launching the slow content generation and then write the content as it is generated. I made this small example (using cl-who):
(defun test-page () (with-html-output (*standard-output* (send-headers) :prologue t :indent t) (:html (:body (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 0)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 1)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 2)) (finish-output *standard-output*) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 3)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 4)) (:p (sleep 3) (fmt "hi, i'm the ~dth loop" 5))))))
Running it (without the call to send-headers) in my REPL have the desired result: each part is printer before the next call to sleep. On the other hand, when I try it live with TBNL I have to wait for the whole page to be generated. Maybe is misinterpreted the documentation. Is it possible to write partial pages to the client stream with TBNL?
I'm using apache2 with the latest mod_lisp2 and TBNL 0.9.9 on a Debian Etch system.
Your information is sent in chunks to mod_lisp, but that's not what your browser sees. It sees what Apache will eventually send. You can use SEND-HEADERS as described above to achieve what you want, but only if you use TBNL in "stand-alone mode" or if you use a front-end like Hunchentoot. (I'm not sure about Araneida, maybe that'll also work.) Cheers, Edi.

Edi Weitz <edi@agharta.de> writes:
Your information is sent in chunks to mod_lisp, but that's not what your browser sees. It sees what Apache will eventually send.
You can use SEND-HEADERS as described above to achieve what you want, but only if you use TBNL in "stand-alone mode" or if you use a front-end like Hunchentoot. (I'm not sure about Araneida, maybe that'll also work.)
I know when I finished to generate the fast content, is there a way to pack and send a mod_lisp chunk? Something like FINISH-OUTPUT would be great. Otherwise using Hunchentoot is doable. -- Yannick Gingras
participants (2)
-
Edi Weitz
-
Yannick Gingras