Multiple subrequest in handler

Adrian Perez de Castro adrianperez at udc.es
Mon Sep 10 16:54:15 MSD 2007


Hello again,

As I mentioned some days ago, I am writing an extended autoindex module
which should be able of including custom header and footer to listings.
Both Evan and Igor suggested using subrequests for them. After some
tinkering, I implemented sending the header, and I used a similar piece
of code to send the footer, snippet follows:

    if (alcf->header.len > 0) {
        /* header is configured -> do a subrequest. */
        ngx_http_request_t *sr;
        ngx_str_t *sr_uri = &alcf->header;
        ngx_str_t rel_uri;
        ngx_int_t rc;

        if (*sr_uri->data != '/') {
            /* Relative path */
            rel_uri.len  = r->uri.len + alcf->header.len;
            rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
            if (rel_uri.data == NULL)
                return NGX_HTTP_INTERNAL_SERVER_ERROR;

            ngx_memcpy(
                    ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
                    alcf->header.data, alcf->header.len);
            sr_uri = &rel_uri;
        }

     
        rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
        if (rc == NGX_ERROR || rc == NGX_DONE)
            return rc;
    }


But as it is the file listing appears at the *end* of the generated
response. So, instead of:

 - header (from subrequest)
 - listing (generated in handler)
 - footer (from subrequest)

I am currently getting this:

 - header (from subrequest)
 - footer (from subrequest)
 - listing (generated in handler)

...which is not a proper order at all!

I took another look at the addition module, and it seems to be called
*twice* per request and it controls whether to add before or after
original content depending on the context (checking the boolean of
ctx->before_body_sent), but about line ~160 it seems to reorder buffers
in the output chain with this piece of code:

    last = 0;

    for (cl = in; cl; cl = cl->next) {
        if (cl->buf->last_buf) {
            cl->buf->last_buf = 0;
            cl->buf->sync = 1;
            last = 1;
        }
    }

I am using a content handler (as autoindex does) and the addition
module uses a filter handler... Is it enough for me if I reorder
buffers or should I rewrite my module using a filter too?

Also, the addition module calls ngx_http_next_body_filter() in some
places, but I think I should not call it: if I understood the code
correctly, it does so to filter the original content to which pieces
are added. As I am generated my own content, I think it would not be
necessary to filter it...

Once again, thank you in advance for your support and your time.
Comments are welcome ;-)


P.S. Once I fix this issue, I will start publishing the code of the
module. I wonder which format is preferred by the Nginx users for
work-in-progress code: repository or snapshot tarballs or whatever.

-- 
Adrian Perez de Castro               <adrianperez at udc.es>
Oficina de Software Libre     http://softwarelibre.udc.es
Universidade da Coruña                  http://www.udc.es
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://nginx.org/pipermail/nginx/attachments/20070910/2348b16d/attachment.pgp>


More information about the nginx mailing list