ngx_int_t
ngx_http_set_exten(ngx_http_request_t *r)
{
    ngx_int_t  i;
    r->exten.len = 0;
    r->exten.data = NULL;
    for (i = r->uri.len - 1; i > 1; i--) {
        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {
            r->exten.len = r->uri.len - i - 1;
            r->exten.data = &r->uri.data[i + 1];
            break;
        } else if (r->uri.data[i] == '/') {
            break;
        }
    }
    return NGX_OK;
}
['ngx_int_t\nngx_http_subrequest(ngx_http_request_t *r,\n    ngx_str_t *uri, ngx_str_t *args, ngx_http_request_t **psr,\n    ngx_http_post_subrequest_t *ps, ngx_uint_t flags)\n{\n    ngx_connection_t              *c;\n    ngx_http_request_t            *sr;\n    ngx_http_core_srv_conf_t      *cscf;\n    ngx_http_postponed_request_t  *pr, *p;\n    r->main->subrequests--;\n    if (r->main->subrequests == 0) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                      "subrequests cycle while processing \\"%V\\"", uri);\n        r->main->subrequests = 1;\n        return NGX_ERROR;\n    }\n    sr = ngx_pcalloc(r->pool, sizeof(ngx_http_request_t));\n    if (sr == NULL) {\n        return NGX_ERROR;\n    }\n    sr->signature = NGX_HTTP_MODULE;\n    c = r->connection;\n    sr->connection = c;\n    sr->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);\n    if (sr->ctx == NULL) {\n        return NGX_ERROR;\n    }\n    if (ngx_list_init(&sr->headers_out.headers, r->pool, 20,\n                      sizeof(ngx_table_elt_t))\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);\n    sr->main_conf = cscf->ctx->main_conf;\n    sr->srv_conf = cscf->ctx->srv_conf;\n    sr->loc_conf = cscf->ctx->loc_conf;\n    sr->pool = r->pool;\n    sr->headers_in = r->headers_in;\n    ngx_http_clear_content_length(sr);\n    ngx_http_clear_accept_ranges(sr);\n    ngx_http_clear_last_modified(sr);\n    sr->request_body = r->request_body;\n    sr->method = NGX_HTTP_GET;\n    sr->http_version = r->http_version;\n    sr->request_line = r->request_line;\n    sr->uri = *uri;\n    if (args) {\n        sr->args = *args;\n    }\n    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,\n                   "http subrequest \\"%V?%V\\"", uri, &sr->args);\n    sr->zero_in_uri = (flags & NGX_HTTP_ZERO_IN_URI) != 0;\n    sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;\n    sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;\n    sr->unparsed_uri = r->unparsed_uri;\n    sr->method_name = ngx_http_core_get_method;\n    sr->http_protocol = r->http_protocol;\n    if (ngx_http_set_exten(sr) != NGX_OK) {\n        return NGX_ERROR;\n    }\n    sr->main = r->main;\n    sr->parent = r;\n    sr->post_subrequest = ps;\n    sr->read_event_handler = ngx_http_request_empty_handler;\n    sr->write_event_handler = ngx_http_handler;\n    if (c->data == r && r->postponed == NULL) {\n        c->data = sr;\n    }\n    sr->variables = r->variables;\n    sr->log_handler = r->log_handler;\n    pr = ngx_palloc(r->pool, sizeof(ngx_http_postponed_request_t));\n    if (pr == NULL) {\n        return NGX_ERROR;\n    }\n    pr->request = sr;\n    pr->out = NULL;\n    pr->next = NULL;\n    if (r->postponed) {\n        for (p = r->postponed; p->next; p = p->next) {   }\n        p->next = pr;\n    } else {\n        r->postponed = pr;\n    }\n    sr->internal = 1;\n    sr->discard_body = r->discard_body;\n    sr->expect_tested = 1;\n    sr->main_filter_need_in_memory = r->main_filter_need_in_memory;\n    sr->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1;\n    r->main->subrequests++;\n    *psr = sr;\n    return ngx_http_post_request(sr);\n}', "ngx_int_t\nngx_http_set_exten(ngx_http_request_t *r)\n{\n    ngx_int_t  i;\n    r->exten.len = 0;\n    r->exten.data = NULL;\n    for (i = r->uri.len - 1; i > 1; i--) {\n        if (r->uri.data[i] == '.' && r->uri.data[i - 1] != '/') {\n            r->exten.len = r->uri.len - i - 1;\n            r->exten.data = &r->uri.data[i + 1];\n            break;\n        } else if (r->uri.data[i] == '/') {\n            break;\n        }\n    }\n    return NGX_OK;\n}"]