diff src/http/ngx_http_script.c @ 180:4cd3e70c4d60 NGINX_0_3_37

nginx 0.3.37 *) Feature: the "limit_except" directive. *) Feature: the "if" directive supports the "!~", "!~*", "-f", and "!-f" operators. *) Feature: the ngx_http_perl_module supports the $r->request_body method. *) Bugfix: in the ngx_http_addition_filter_module.
author Igor Sysoev <http://sysoev.ru>
date Fri, 07 Apr 2006 00:00:00 +0400
parents 1b490fc19afa
children 54aabf2b0bc6
line wrap: on
line diff
--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -588,8 +588,15 @@ ngx_http_script_regex_start_code(ngx_htt
         e->ncaptures = 0;
 
         if (code->test) {
-            e->sp->len = 0;
-            e->sp->data = (u_char *) "";
+            if (code->negative_test) {
+                e->sp->len = 1;
+                e->sp->data = (u_char *) "1";
+
+            } else {
+                e->sp->len = 0;
+                e->sp->data = (u_char *) "";
+            }
+
             e->sp++;
 
             e->ip += sizeof(ngx_http_script_regex_code_t);
@@ -618,8 +625,15 @@ ngx_http_script_regex_start_code(ngx_htt
     e->ncaptures = code->ncaptures;
 
     if (code->test) {
-        e->sp->len = 1;
-        e->sp->data = (u_char *) "1";
+        if (code->negative_test) {
+            e->sp->len = 0;
+            e->sp->data = (u_char *) "";
+
+        } else {
+            e->sp->len = 1;
+            e->sp->data = (u_char *) "1";
+        }
+
         e->sp++;
 
         e->ip += sizeof(ngx_http_script_regex_code_t);
@@ -911,6 +925,69 @@ ngx_http_script_not_equal_code(ngx_http_
 
 
 void
+ngx_http_script_file_code(ngx_http_script_engine_t *e)
+{
+    ngx_err_t                     err;
+    ngx_file_info_t               fi;
+    ngx_http_variable_value_t    *value;
+    ngx_http_script_file_code_t  *code;
+
+    value = e->sp - 1;
+
+    code = (ngx_http_script_file_code_t *) e->ip;
+    e->ip += sizeof(ngx_http_script_file_code_t);
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
+                   "http script file op %p", code->op);
+
+    if (ngx_file_info(value->data, &fi) == -1) {
+        err = ngx_errno;
+
+        if (err != NGX_ENOENT && err != NGX_ENOTDIR) {
+            ngx_log_error(NGX_LOG_CRIT, e->request->connection->log, err,
+                          ngx_file_info_n " \"%s\" failed", value->data);
+        }
+
+        switch (code->op) {
+        case ngx_http_script_file_plain:
+             goto false;
+        case ngx_http_script_file_not_plain:
+             goto true;
+        }
+
+        goto false;
+    }
+
+    switch (code->op) {
+    case ngx_http_script_file_plain:
+        if (ngx_is_file(&fi)) {
+             goto true;
+        }
+        goto false;
+
+    case ngx_http_script_file_not_plain:
+        if (ngx_is_file(&fi)) {
+            goto false;
+        }
+        goto true;
+    }
+
+false:
+
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
+                   "http script file op false");
+
+    *value = ngx_http_variable_null_value;
+    return;
+
+true:
+
+    *value = ngx_http_variable_true_value;
+    return;
+}
+
+
+void
 ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
 {
     size_t                                 len;