⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_http_script.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
    return new;}size_tngx_http_script_copy_len_code(ngx_http_script_engine_t *e){    ngx_http_script_copy_code_t  *code;    code = (ngx_http_script_copy_code_t *) e->ip;    e->ip += sizeof(ngx_http_script_copy_code_t);    return code->len;}voidngx_http_script_copy_code(ngx_http_script_engine_t *e){    ngx_http_script_copy_code_t  *code;    code = (ngx_http_script_copy_code_t *) e->ip;    if (!e->skip) {        e->pos = ngx_copy(e->pos, e->ip + sizeof(ngx_http_script_copy_code_t),                          code->len);    }    e->ip += sizeof(ngx_http_script_copy_code_t)          + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,                   "http script copy: \"%V\"", &e->buf);}size_tngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e){    ngx_http_variable_value_t   *value;    ngx_http_script_var_code_t  *code;    code = (ngx_http_script_var_code_t *) e->ip;    e->ip += sizeof(ngx_http_script_var_code_t);    if (e->flushed) {        value = ngx_http_get_indexed_variable(e->request, code->index);    } else {        value = ngx_http_get_flushed_variable(e->request, code->index);    }    if (value && !value->not_found) {        return value->len;    }    return 0;}voidngx_http_script_copy_var_code(ngx_http_script_engine_t *e){    ngx_http_variable_value_t   *value;    ngx_http_script_var_code_t  *code;    code = (ngx_http_script_var_code_t *) e->ip;    e->ip += sizeof(ngx_http_script_var_code_t);    if (!e->skip) {        if (e->flushed) {            value = ngx_http_get_indexed_variable(e->request, code->index);        } else {            value = ngx_http_get_flushed_variable(e->request, code->index);        }        if (value && !value->not_found) {            e->pos = ngx_copy(e->pos, value->data, value->len);            ngx_log_debug1(NGX_LOG_DEBUG_HTTP,                           e->request->connection->log, 0,                           "http script var: \"%V\"", &e->buf);        }    }}size_tngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e){    ngx_http_script_copy_capture_code_t  *code;    code = (ngx_http_script_copy_capture_code_t *) e->ip;    e->ip += sizeof(ngx_http_script_copy_capture_code_t);    if (code->n < e->ncaptures) {        if ((e->is_args || e->quote)            && (e->request->quoted_uri || e->request->plus_in_uri))        {            return e->captures[code->n + 1] - e->captures[code->n]                   + 2 * ngx_escape_uri(NULL,                                &e->line.data[e->captures[code->n]],                                e->captures[code->n + 1] - e->captures[code->n],                                NGX_ESCAPE_ARGS);        } else {            return e->captures[code->n + 1] - e->captures[code->n];        }    }    return 0;}voidngx_http_script_copy_capture_code(ngx_http_script_engine_t *e){    ngx_http_script_copy_capture_code_t  *code;    code = (ngx_http_script_copy_capture_code_t *) e->ip;    e->ip += sizeof(ngx_http_script_copy_capture_code_t);    if (code->n < e->ncaptures) {        if ((e->is_args || e->quote)            && (e->request->quoted_uri || e->request->plus_in_uri))        {            e->pos = (u_char *) ngx_escape_uri(e->pos,                                &e->line.data[e->captures[code->n]],                                e->captures[code->n + 1] - e->captures[code->n],                                NGX_ESCAPE_ARGS);        } else {            e->pos = ngx_copy(e->pos,                              &e->line.data[e->captures[code->n]],                              e->captures[code->n + 1] - e->captures[code->n]);        }    }    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,                   "http script capture: \"%V\"", &e->buf);}size_tngx_http_script_mark_args_code(ngx_http_script_engine_t *e){    e->is_args = 1;    e->ip += sizeof(uintptr_t);    return 1;}voidngx_http_script_start_args_code(ngx_http_script_engine_t *e){    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,                   "http script args");    e->args = e->pos;    e->ip += sizeof(uintptr_t);}#if (NGX_PCRE)voidngx_http_script_regex_start_code(ngx_http_script_engine_t *e){    size_t                         len;    ngx_int_t                      rc;    ngx_uint_t                     n;    ngx_http_request_t            *r;    ngx_http_script_engine_t       le;    ngx_http_script_len_code_pt    lcode;    ngx_http_script_regex_code_t  *code;    code = (ngx_http_script_regex_code_t *) e->ip;    r = e->request;    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,                   "http script regex: \"%V\"", &code->name);    if (code->uri) {        e->line = r->uri;    } else {        e->sp--;        e->line.len = e->sp->len;        e->line.data = e->sp->data;    }    rc = ngx_regex_exec(code->regex, &e->line, e->captures, code->ncaptures);    if (rc == NGX_REGEX_NO_MATCHED) {        if (e->log) {            ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,                          "\"%V\" does not match \"%V\"",                          &code->name, &e->line);        }        e->ncaptures = 0;        if (code->test) {            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);            return;        }        e->ip += code->next;        return;    }    if (rc < 0) {        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,                      ngx_regex_exec_n " failed: %d on \"%V\" using \"%V\"",                      rc, &e->line, &code->name);        e->ip = ngx_http_script_exit;        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;        return;    }    if (e->log) {        ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,                      "\"%V\" matches \"%V\"", &code->name, &e->line);    }    e->ncaptures = code->ncaptures;    if (code->test) {        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);        return;    }    if (code->status) {        e->status = code->status;        if (!code->redirect) {            e->ip = ngx_http_script_exit;            return;        }    }    if (code->uri) {        r->internal = 1;        r->valid_unparsed_uri = 0;        if (code->break_cycle) {            r->valid_location = 0;            r->uri_changed = 0;        } else {            r->uri_changed = 1;        }    }    if (code->lengths == NULL) {        e->buf.len = code->size;        if (code->uri) {            if (rc && (r->quoted_uri || r->plus_in_uri)) {                e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,                                                 NGX_ESCAPE_ARGS);            }        }        for (n = 1; n < (ngx_uint_t) rc; n++) {            e->buf.len += e->captures[2 * n + 1] - e->captures[2 * n];        }    } else {        ngx_memzero(&le, sizeof(ngx_http_script_engine_t));        le.ip = code->lengths->elts;        le.line = e->line;        le.request = r;        le.captures = e->captures;        le.ncaptures = e->ncaptures;        le.quote = code->redirect;        len = 0;        while (*(uintptr_t *) le.ip) {            lcode = *(ngx_http_script_len_code_pt *) le.ip;            len += lcode(&le);        }        e->buf.len = len;        e->is_args = le.is_args;    }    if (code->add_args && r->args.len) {        e->buf.len += r->args.len + 1;    }    e->buf.data = ngx_palloc(r->pool, e->buf.len);    if (e->buf.data == NULL) {        e->ip = ngx_http_script_exit;        e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;        return;    }    e->quote = code->redirect;    e->pos = e->buf.data;    e->ip += sizeof(ngx_http_script_regex_code_t);}voidngx_http_script_regex_end_code(ngx_http_script_engine_t *e){    u_char                            *dst, *src;    ngx_http_request_t                *r;    ngx_http_script_regex_end_code_t  *code;    code = (ngx_http_script_regex_end_code_t *) e->ip;    r = e->request;    e->quote = 0;    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,                   "http script regex end");    if (code->redirect) {        dst = e->buf.data;        src = e->buf.data;        ngx_unescape_uri(&dst, &src, e->pos - e->buf.data,                         NGX_UNESCAPE_REDIRECT);        if (src < e->pos) {            dst = ngx_copy(dst, src, e->pos - src);        }        e->pos = dst;        if (code->add_args && r->args.len) {            *e->pos++ = (u_char) (code->args ? '&' : '?');            e->pos = ngx_copy(e->pos, r->args.data, r->args.len);        }        e->buf.len = e->pos - e->buf.data;        if (e->log) {            ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,                          "rewritten redirect: \"%V\"", &e->buf);        }        r->headers_out.location = ngx_list_push(&r->headers_out.headers);        if (r->headers_out.location == NULL) {            e->ip = ngx_http_script_exit;            e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;            return;        }        r->headers_out.location->hash = 1;        r->headers_out.location->key.len = sizeof("Location") - 1;        r->headers_out.location->key.data = (u_char *) "Location";        r->headers_out.location->value = e->buf;        e->ip += sizeof(ngx_http_script_regex_end_code_t);        return;    }    if (e->args) {        e->buf.len = e->args - e->buf.data;        if (code->add_args && r->args.len) {            *e->pos++ = '&';            e->pos = ngx_copy(e->pos, r->args.data, r->args.len);        }        r->args.len = e->pos - e->args;        r->args.data = e->args;        e->args = NULL;    } else {        e->buf.len = e->pos - e->buf.data;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -