aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_script.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/ngx_http_script.c')
-rw-r--r--src/http/ngx_http_script.c85
1 files changed, 81 insertions, 4 deletions
diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
index dc7b89538..ab6f3a0e4 100644
--- 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_http_script_engine_t *e)
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_http_script_engine_t *e)
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_script_engine_t *e)
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;