--- nginx-0.1.41/src/http/modules/ngx_http_rewrite_module.c.orig 2005-07-07 17:20:46 +0400 +++ nginx-0.1.41/src/http/modules/ngx_http_rewrite_module.c 2005-08-18 00:50:24 +0400 @@ -189,6 +189,99 @@ ngx_http_rewrite_handler(ngx_http_reques static void +ngx_http_rewrite_file_not_exists_code(ngx_http_script_engine_t *e) +{ + ngx_http_request_t *r; + ngx_http_core_loc_conf_t *clcf; + ngx_file_info_t fi; + ngx_str_t name; + u_char* last; + + r = e->request; + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + name.data = ngx_palloc(r->pool, clcf->root.len + r->uri.len + 2); + if (name.data == NULL) { + e->sp->value = 1; + e->sp->text.len = 1; + e->sp->text.data = (u_char *) "1"; + e->sp++; + + return; + } + + last = ngx_cpymem(name.data, clcf->root.data, clcf->root.len); + last = ngx_cpystrn(last, r->uri.data, r->uri.len + 1); + + name.len = last - name.data; + + if (ngx_file_info(name.data, &fi) == NGX_FILE_ERROR) { + e->sp->value = 1; + e->sp->text.len = 1; + e->sp->text.data = (u_char *) "1"; + e->sp++; + } + else { + e->sp->value = 0; + e->sp->text.len = 0; + e->sp->text.data = (u_char *) ""; + e->sp++; + } + + ngx_pfree(r->pool, name.data); + + e->ip += sizeof(uintptr_t); +} + + +static void +ngx_http_rewrite_dir_not_exists_code(ngx_http_script_engine_t *e) +{ + ngx_http_request_t *r; + ngx_http_core_loc_conf_t *clcf; + ngx_dir_t dir; + ngx_str_t dname; + u_char *last; + + r = e->request; + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + dname.data = ngx_palloc(r->pool, clcf->root.len + r->uri.len + + NGX_DIR_MASK_LEN); + if (dname.data == NULL) { + e->sp->value = 1; + e->sp->text.len = 1; + e->sp->text.data = (u_char *) "1"; + e->sp++; + + return; + } + + last = ngx_cpymem(dname.data, clcf->root.data, clcf->root.len); + last = ngx_cpystrn(last, r->uri.data, r->uri.len + 1); + + dname.len = last - dname.data; + + if (ngx_open_dir(&dname, &dir) == NGX_FILE_ERROR) { + e->sp->value = 1; + e->sp->text.len = 1; + e->sp->text.data = (u_char *) "1"; + e->sp++; + } + else { + e->sp->value = 0; + e->sp->text.len = 0; + e->sp->text.data = (u_char *) ""; + e->sp++; + } + + ngx_pfree(r->pool, dname.data); + + e->ip += sizeof(uintptr_t); +} + + +static void ngx_http_rewrite_invalid_referer_code(ngx_http_script_engine_t *e) { u_char *ref; @@ -892,6 +985,31 @@ ngx_http_rewrite_variable(ngx_conf_t *cf *code = ngx_http_rewrite_invalid_referer_code; + } else if (value->len == sizeof("file_not_exists") - 1 + && ngx_strncmp(value->data, "file_not_exists", + sizeof("file_not_exists") - 1) == 0) + { + code = ngx_http_script_start_code(cf->pool, &lcf->codes, + sizeof(ngx_http_script_code_pt)); + + if (code == NULL) { + return NGX_CONF_ERROR; + } + + *code = ngx_http_rewrite_file_not_exists_code; + + } else if (value->len == sizeof("dir_not_exists") - 1 + && ngx_strncmp(value->data, "dir_not_exists", + sizeof("dir_not_exists") - 1) == 0) + { + code = ngx_http_script_start_code(cf->pool, &lcf->codes, + sizeof(ngx_http_script_code_pt)); + if (code == NULL) { + return NGX_CONF_ERROR; + } + + *code = ngx_http_rewrite_dir_not_exists_code; + } else { index = ngx_http_get_variable_index(cf, value);