Is this the right way to do synchronous subrequests?

Brian Pane brianp at brianp.net
Mon Jan 11 22:27:18 MSK 2010


In one of my modules, I needed to run several subrequests serially and
send their output back to the original client.  After looking at
mod_ssi_filter and mod_echo, I was able to write a module that worked.
 However, because the subrequest code is complicated, I'd like a
second opinion.  Can someone who's familiar with the subrequest
mechanism please take a look at the code example below (which is a
simplified version of my actual code, to make it easier to read) and
let me know if I'm using subrequests in the proper manner?

One specific question I have is: What does the
NGX_HTTP_SUBREQUEST_IN_MEMORY flag do?

I'm using nginx-0.7, if that makes a difference.

Thanks,
-Brian

typedef struct {
    ngx_http_request_t *wait;
} my_ctx_t;

static ngx_int_t
my_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
    my_ctx_t *ctx;

    ctx = ngx_http_get_module_ctx(r, my_module);
    if (ctx == NULL) {
        ctx = ngx_pcalloc(r->pool, sizeof(*ctx));
        ngx_http_set_ctx(r, ctx, my_module);
    }

    if (r != r->main) {
        return ngx_http_next_body_filter(r, in);
    }

    if (ctx->wait != NULL) {
        if (r != r->connection->data) {
            return NGX_AGAIN;
        }
        if (ctx->wait->done) {
            ctx->wait = NULL;
        }
        else {
            return ngx_http_next_body_filter(r, NULL);
        }
    }

    if (/* more subrequests remain to be issued */) {
        ngx_http_request_t *sr;
        int rc;
        ngx_str_t *uri = /* URI of next subrequest */
        rc = ngx_http_subrequest(r, uri, NULL, &sr, NULL,
                                 NGX_HTTP_SUBREQUEST_WAITED);
        if (rc != NGX_OK) {
            /* error */
            return rc;
        }
        ctx->wait = sr;
    }

    return ngx_http_next_body_filter(r, NULL);
}



More information about the nginx-devel mailing list