From 0100cbc5f355478646c9c0c4a7d0a6ccd0e5aca3 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Sat, 27 Sep 2008 11:48:28 +0000 Subject: $random_index variable --- src/http/modules/ngx_http_random_index_module.c | 59 ++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/http/modules/ngx_http_random_index_module.c b/src/http/modules/ngx_http_random_index_module.c index 23610f9e0..eb70ac872 100644 --- a/src/http/modules/ngx_http_random_index_module.c +++ b/src/http/modules/ngx_http_random_index_module.c @@ -19,10 +19,11 @@ typedef struct { static ngx_int_t ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name); -static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf); static void *ngx_http_random_index_create_loc_conf(ngx_conf_t *cf); static char *ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); +static ngx_int_t ngx_http_random_index_add_variable(ngx_conf_t *cf); +static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf); static ngx_command_t ngx_http_random_index_commands[] = { @@ -39,7 +40,7 @@ static ngx_command_t ngx_http_random_index_commands[] = { static ngx_http_module_t ngx_http_random_index_module_ctx = { - NULL, /* preconfiguration */ + ngx_http_random_index_add_variable, /* preconfiguration */ ngx_http_random_index_init, /* postconfiguration */ NULL, /* create main configuration */ @@ -69,6 +70,10 @@ ngx_module_t ngx_http_random_index_module = { }; +static ngx_str_t ngx_http_random_index = ngx_string("random_index"); +static ngx_int_t ngx_random_index_variable_index; + + static ngx_int_t ngx_http_random_index_handler(ngx_http_request_t *r) { @@ -80,6 +85,7 @@ ngx_http_random_index_handler(ngx_http_request_t *r) ngx_dir_t dir; ngx_uint_t n, level; ngx_array_t names; + ngx_http_variable_value_t *v; ngx_http_random_index_loc_conf_t *rlcf; if (r->uri.data[r->uri.len - 1] != '/') { @@ -257,6 +263,14 @@ ngx_http_random_index_handler(ngx_http_request_t *r) last = ngx_copy(uri.data, r->uri.data, r->uri.len); ngx_memcpy(last, name[n].data, name[n].len); + v = &r->variables[ngx_random_index_variable_index]; + + v->len = name[n].len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = name[n].data; + return ngx_http_internal_redirect(r, &uri, &r->args); } @@ -274,6 +288,22 @@ ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir, } +static ngx_int_t +ngx_http_random_index_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + /* + * the "random_index" directive stores index file name directly inside + * r->variables[] because request context is not preserved while + * an internal redirection + */ + + v->not_found = 1; + + return NGX_OK; +} + + static void * ngx_http_random_index_create_loc_conf(ngx_conf_t *cf) { @@ -302,6 +332,31 @@ ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) } +static ngx_int_t +ngx_http_random_index_add_variable(ngx_conf_t *cf) +{ + ngx_int_t index; + ngx_http_variable_t *var; + + var = ngx_http_add_variable(cf, &ngx_http_random_index, + NGX_HTTP_VAR_NOHASH); + if (var == NULL) { + return NGX_ERROR; + } + + index = ngx_http_get_variable_index(cf, &ngx_http_random_index); + if (index == NGX_ERROR) { + return NGX_ERROR; + } + + ngx_random_index_variable_index = index; + + var->get_handler = ngx_http_random_index_variable; + + return NGX_OK; +} + + static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf) { -- cgit v1.2.3