You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Todd Finney <tf...@boygenius.com> on 2000/10/30 06:29:02 UTC

maximum (practical) size of $r->notes

This is a follow-up on a question that I asked a couple of 
months ago.  The subject was "executing a cgi from within a 
handler (templating redux)", dated 8/23/00.

The gist of the matter is that we need a handler which will 
serve html pages ('content files') inside of other html 
files ('template files'), while sticking other files and 
scripts ('component files') into the template at the same 
time.  Quasi-frames, if you will.  We've already covered 
why we didn't pick one of the readily-available packages to 
do this.

We've had a working handler that does _almost_everything it 
needs to do.  When the user requests a page, it figures out 
which template to use (based on the page requested), which 
component set to use (based on the user and the page), 
rolls the whole thing together and sends it along.

The wrapper can handle both static files and scripts as 
components or content files, and works really well most of 
the time.  However, we've run into a problem when a page 
needs to redirect after execution, such as a login page.

The problem is that when a component or content file is a 
script, the server executes that script when it encounters 
it in the template, a'la

- hey, the user wants foo.html
- the user is a member of group 'coders', and their 
component path is
    /www/htdocs/components/coders/
- foo.html wants template set 1,
- go get /www/htdocs/components/coders/tmpl_1, and open
- begin printing the template file to the browser.  As the 
file goes by,
   watch for <[tags]> containing insertion points.
- hey, there's <[head]>, print or execute 
/www/htdocs/components/coders/head_1
- hey, there's <[tool]>, print or execute 
/www/htdocs/components/coders/tool_1
- hey, there's <[cont]>, print or execute foo.html
- hey, there's <[foot]>, print or execute 
/www/htdocs/components/coders/foot_1
- finish printing /www/htdocs/components/coders/tmpl_1 and 
close

If /www/htdocs/components/coders/tool_1 has a redirect call 
in it, it's too late for the browser to actually do 
anything about it.

I managed to corner Nathan in New York (thanks, Nathan!). 
He recommended a two-stage handler, one that processes the 
components and content, and another that actually handles 
the printing.  Using $r->notes, the second handler could be 
aware of what it needed to do before printing 
anything.  This is a really good idea, but it's turning out 
to be more difficult than I anticipated.

The only way I can think of doing this is adding a third 
handler, in the middle, that executes any scripts and 
stores the output somewhere.  Then it would check the 
output for a Location: header and set something like 
$notes->{'redirect'} if it finds anything.  The third 
handler would then check that value before printing 
anything.  If it's there, do it; if not, grab the output 
and the static files and print them to the user.

I'm concerned about putting large amounts of data into 
$r->notes.  Some of our script output can be pretty 
heavy.  If $r->notes can only take simple strings, how 
large of a simple string is it safe to put in it?  Is there 
a better way to do this?

cheers and thanks,
Todd











Re: maximum (practical) size of $r->notes

Posted by Matt Sergeant <ma...@sergeant.org>.
On Mon, 30 Oct 2000, Todd Finney wrote:

> I'm concerned about putting large amounts of data into 
> $r->notes.  Some of our script output can be pretty 
> heavy.  If $r->notes can only take simple strings, how 
> large of a simple string is it safe to put in it?  Is there 
> a better way to do this?

AxKit uses the notes table to store interim strings for template
processing. I've not yet heard a bug related to it, but then I'm not
delivering massive files. I'd imagine it would probably be limited by
available memory.

-- 
<Matt/>

    /||    ** Director and CTO **
   //||    **  AxKit.com Ltd   **  ** XML Application Serving **
  // ||    ** http://axkit.org **  ** XSLT, XPathScript, XSP  **
 // \\| // **     Personal Web Site: http://sergeant.org/     **
     \\//
     //\\
    //  \\


Re: maximum (practical) size of $r->notes

Posted by Todd Finney <tf...@boygenius.com>.
In continuing my work on this template system, I've run 
into another problem.

Any one or more of the components can be a script, and the 
problem with the existing system which I'm trying to solve 
is catching redirects by them.  The order in which I'm 
doing things is now:

( 4 part handler )
Part 1: Get the template set id (int), title, and meta 
designations from
          the requested file.  Put this list in pnotes.
Part 2: Add to that list the header, footer, toolbar, and 
content files as
         as designated in the template file.
Part 3: Run through the list of components, and execute 
anything that needs
         to be executed.  Capture the output and put it in 
pnotes.
Part 4: Check for redirects, and send one if it exists.  If 
not, print the
         template filled in with the output from the list 
entries.

I had previously been executing component scripts like 
this:

($file is an entry in the list from Parts 1&2.  All entries 
in that list are full pathnames.  $args is a list of 
parameters set up previously in the handler.)

if ( -x $file ) {
    $file =~ s/\/www\/html//o;
    $file = $file .'?'.$args if $args;
    my $subr = $r->lookup_uri($file);
    $subr->handler('cgi-script');
    $subr->run();
    return;
}

This doesn't work especially well anymore, as $subr->run 
outputs to the browser.  I've looked through past list 
messages, and from what I've read there's no way to 
suppress that.

Is there a reason that no one has come up with a method for 
doing this?   It seems like a few people have asked about 
it, are we all going about things the wrong way?  I'm not a 
C guy, so I'd probably need a little guidance, but I'd be 
happy to work a patch if no else wants to.

Barring that, what's the best way to do what I need to 
do?  exec'ing (and it's cousins) the scripts doesn't sound 
pretty, but I'm at a loss on what else to try.

thanks,
Todd





At 12:29 AM 10/30/00, Todd Finney wrote:
>This is a follow-up on a question that I asked a couple of 
>months ago.  The subject was "executing a cgi from within 
>a handler (templating redux)", dated 8/23/00.
>
>The gist of the matter is that we need a handler which 
>will serve html pages ('content files') inside of other 
>html files ('template files'), while sticking other files 
>and scripts ('component files') into the template at the 
>same time.  Quasi-frames, if you will.  We've already 
>covered why we didn't pick one of the readily-available 
>packages to do this.
>
>We've had a working handler that does _almost_everything 
>it needs to do.  When the user requests a page, it figures 
>out which template to use (based on the page requested), 
>which component set to use (based on the user and the 
>page), rolls the whole thing together and sends it along.
>
>The wrapper can handle both static files and scripts as 
>components or content files, and works really well most of 
>the time.  However, we've run into a problem when a page 
>needs to redirect after execution, such as a login page.
>
>The problem is that when a component or content file is a 
>script, the server executes that script when it encounters 
>it in the template, a'la
>
>- hey, the user wants foo.html
>- the user is a member of group 'coders', and their 
>component path is
>     /www/htdocs/components/coders/
>- foo.html wants template set 1,
>- go get /www/htdocs/components/coders/tmpl_1, and open
>- begin printing the template file to the browser.  As the 
>file goes by,
>    watch for <[tags]> containing insertion points.
>- hey, there's <[head]>, print or execute 
>/www/htdocs/components/coders/head_1
>- hey, there's <[tool]>, print or execute 
>/www/htdocs/components/coders/tool_1
>- hey, there's <[cont]>, print or execute foo.html
>- hey, there's <[foot]>, print or execute 
>/www/htdocs/components/coders/foot_1
>- finish printing /www/htdocs/components/coders/tmpl_1 and 
>close
>
>If /www/htdocs/components/coders/tool_1 has a redirect 
>call in it, it's too late for the browser to actually do 
>anything about it.
>
>I managed to corner Nathan in New York (thanks, Nathan!). 
>He recommended a two-stage handler, one that processes the 
>components and content, and another that actually handles 
>the printing.  Using $r->notes, the second handler could 
>be aware of what it needed to do before printing 
>anything.  This is a really good idea, but it's turning 
>out to be more difficult than I anticipated.
>
>The only way I can think of doing this is adding a third 
>handler, in the middle, that executes any scripts and 
>stores the output somewhere.  Then it would check the 
>output for a Location: header and set something like 
>$notes->{'redirect'} if it finds anything.  The third 
>handler would then check that value before printing 
>anything.  If it's there, do it; if not, grab the output 
>and the static files and print them to the user.
>
>I'm concerned about putting large amounts of data into 
>$r->notes.  Some of our script output can be pretty 
>heavy.  If $r->notes can only take simple strings, how 
>large of a simple string is it safe to put in it?  Is 
>there a better way to do this?
>
>cheers and thanks,
>Todd
>
>
>
>
>
>
>
>