mod_layout - what is wrong?
Maxim Dounin
mdounin at mdounin.ru
Thu Jan 7 02:39:14 MSK 2010
Hello!
On Wed, Jan 06, 2010 at 04:09:56PM +0100, witekfl Gazeta.pl wrote:
> Hi,
> http://rkd.republika.pl/ngx_http_layout_filter_module.c
>
> I want to write the mod_layout.
> The idea is: write all chains to temp file, at the end read it, insert the
> header after <body> and the footer before </body>.
> Sometimes it fails. There is only the header and the footer. Why?
> Could you review it?
Some random comments in random order:
1. It's probably good idea to polish style a bit before posting
code for review.
2. The whole idea of buffering to temporary file looks wrong.
There is no need to buffer more than several bytes here. And the
only case where you need buffering is when you find something like
"</b" at the end of buffer, and need next buffer to find out if
it's "</body>" or "</b>". It requires a bit more complicated
matching code, but saves lots of resources. See sub filter
and ssi filter for examples.
3. After writing chain to temp file you have to mark buffers in
this chain as sent by updating buf->pos. This will allow upper
layers to reuse this buffers. Note well: you probably want to
test your code with something like
output_buffers 1 64;
to see what happens if upper layers are out of buffers since you
don't mark them as sent. Hint: request will just hang awaiting
some buffers to become free after first 64 bytes.
4. layout_ignore_uris setting doesn't fit into nginx model of
doing things. One should write correct configuration using
"location" directives instead of doing some fancy filtering at
module level.
5. You assume buffers are in memory, but do not require it. You
should set r->filter_need_in_memory in header filter handler.
Maxim Dounin
More information about the nginx-devel
mailing list