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

📄 ngx_http_ssi_filter_module.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 5 页
字号:
                value = ngx_palloc(r->pool, ctx->param->value.len + 1);                if (value == NULL) {                    return NGX_ERROR;                }                ngx_memcpy(value, ctx->param->value.data,                           ctx->param->value.len);                ctx->value_buf = ctx->param->value.data;                ctx->param->value.data = value;            } else {                ctx->value_buf = NULL;            }            switch (ch) {            case ' ':            case CR:            case LF:            case '\t':                state = ssi_preparam_state;                break;            case '-':                state = ssi_comment_end0_state;                break;            default:                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                              "unexpected \"%c\" symbol after \"%V\" value "                              "of \"%V\" parameter in \"%V\" SSI command",                              ch, &ctx->param->value, &ctx->param->key,                              &ctx->command);                state = ssi_error_state;                break;            }            break;        case ssi_comment_end0_state:            switch (ch) {            case '-':                state = ssi_comment_end1_state;                break;            default:                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                              "unexpected \"%c\" symbol in \"%V\" SSI command",                              ch, &ctx->command);                state = ssi_error_state;                break;            }            break;        case ssi_comment_end1_state:            switch (ch) {            case '>':                ctx->state = ssi_start_state;                ctx->pos = p + 1;                ctx->looked = looked;                ctx->copy_end = copy_end;                if (ctx->copy_start == NULL && copy_end) {                    ctx->copy_start = ctx->buf->pos;                }                return NGX_OK;            default:                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                              "unexpected \"%c\" symbol in \"%V\" SSI command",                              ch, &ctx->command);                state = ssi_error_state;                break;            }            break;        case ssi_error_state:            switch (ch) {            case '-':                state = ssi_error_end0_state;                break;            default:                break;            }            break;        case ssi_error_end0_state:            switch (ch) {            case '-':                state = ssi_error_end1_state;                break;            default:                state = ssi_error_state;                break;            }            break;        case ssi_error_end1_state:            switch (ch) {            case '>':                ctx->state = ssi_start_state;                ctx->pos = p + 1;                ctx->looked = looked;                ctx->copy_end = copy_end;                if (ctx->copy_start == NULL && copy_end) {                    ctx->copy_start = ctx->buf->pos;                }                return NGX_HTTP_SSI_ERROR;            default:                state = ssi_error_state;                break;            }            break;        }    }    ctx->state = state;    ctx->pos = p;    ctx->looked = looked;    ctx->copy_end = (state == ssi_start_state) ? p : copy_end;    if (ctx->copy_start == NULL && ctx->copy_end) {        ctx->copy_start = ctx->buf->pos;    }    return NGX_AGAIN;}static ngx_str_t *ngx_http_ssi_get_variable(ngx_http_request_t *r, ngx_str_t *name,    ngx_uint_t key){    ngx_uint_t           i;    ngx_list_part_t     *part;    ngx_http_ssi_var_t  *var;    ngx_http_ssi_ctx_t  *ctx;    ctx = ngx_http_get_module_ctx(r->main, ngx_http_ssi_filter_module);    if (ctx->variables == NULL) {        return NULL;    }    part = &ctx->variables->part;    var = part->elts;    for (i = 0; /* void */ ; i++) {        if (i >= part->nelts) {            if (part->next == NULL) {                break;            }            part = part->next;            var = part->elts;            i = 0;        }        if (name->len != var[i].name.len) {            continue;        }        if (key != var[i].key) {            continue;        }        if (ngx_strncmp(name->data, var[i].name.data, name->len) == 0) {            return &var[i].value;        }    }    return NULL;}static ngx_int_tngx_http_ssi_evaluate_string(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,    ngx_str_t *text, ngx_uint_t flags){    u_char                      ch, *p, **value, *data, *part_data;    size_t                     *size, len, prefix, part_len;    ngx_str_t                   var, *val;    ngx_int_t                   key;    ngx_uint_t                  i, j, n, bracket, quoted;    ngx_array_t                 lengths, values;    ngx_http_variable_value_t  *vv;    n = ngx_http_script_variables_count(text);    if (n == 0) {        data = text->data;        p = data;        if ((flags & NGX_HTTP_SSI_ADD_PREFIX) && text->data[0] != '/') {            for (prefix = r->uri.len; prefix; prefix--) {                if (r->uri.data[prefix - 1] == '/') {                    break;                }            }            if (prefix) {                len = prefix + text->len;                data = ngx_palloc(r->pool, len);                if (data == NULL) {                    return NGX_ERROR;                }                p = ngx_copy(data, r->uri.data, prefix);            }        }        quoted = 0;        for (i = 0 ; i < text->len; i++) {            ch = text->data[i];            if (!quoted) {                if (ch == '\\') {                    quoted = 1;                    continue;                }            } else {                quoted = 0;                if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {                    *p++ = '\\';                }            }            *p++ = ch;        }        text->len = p - data;        text->data = data;        return NGX_OK;    }    if (ngx_array_init(&lengths, r->pool, 8, sizeof(size_t *)) != NGX_OK) {        return NGX_ERROR;    }    if (ngx_array_init(&values, r->pool, 8, sizeof(u_char *)) != NGX_OK) {        return NGX_ERROR;    }    len = 0;    i = 0;    while (i < text->len) {        if (text->data[i] == '$') {            var.len = 0;            if (++i == text->len) {                goto invalid_variable;            }            if (text->data[i] == '{') {                bracket = 1;                if (++i == text->len) {                    goto invalid_variable;                }                var.data = &text->data[i];            } else {                bracket = 0;                var.data = &text->data[i];            }            for ( /* void */ ; i < text->len; i++, var.len++) {                ch = text->data[i];                if (ch == '}' && bracket) {                    i++;                    bracket = 0;                    break;                }                if ((ch >= 'A' && ch <= 'Z')                    || (ch >= 'a' && ch <= 'z')                    || (ch >= '0' && ch <= '9')                    || ch == '_')                {                    continue;                }                break;            }            if (bracket) {                ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                              "the closing bracket in \"%V\" "                              "variable is missing", &var);                return NGX_HTTP_SSI_ERROR;            }            if (var.len == 0) {                goto invalid_variable;            }            key = 0;            for (j = 0; j < var.len; j++) {                var.data[j] = ngx_tolower(var.data[j]);                key = ngx_hash(key, var.data[j]);            }            val = ngx_http_ssi_get_variable(r, &var, key);            if (val == NULL) {                vv = ngx_http_get_variable(r, &var, key,                                           flags & NGX_HTTP_SSI_EXPR_TEST);                if (vv == NULL) {                    return NGX_ERROR;                }                if (vv->not_found) {                    continue;                }                part_data = vv->data;                part_len = vv->len;            } else {                part_data = val->data;                part_len = val->len;            }        } else {            part_data = &text->data[i];            quoted = 0;            for (p = part_data; i < text->len; i++) {                ch = text->data[i];                if (!quoted) {                    if (ch == '\\') {                        quoted = 1;                        continue;                    }                    if (ch == '$') {                        break;                    }                } else {                    quoted = 0;                    if (ch != '\\' && ch != '\'' && ch != '"' && ch != '$') {                        *p++ = '\\';                    }                }                *p++ = ch;            }            part_len = p - part_data;        }        len += part_len;        size = ngx_array_push(&lengths);        if (size == NULL) {            return NGX_ERROR;        }        *size = part_len;        value = ngx_array_push(&values);        if (value == NULL) {            return NGX_ERROR;        }        *value = part_data;    }    prefix = 0;    size = lengths.elts;    value = values.elts;    if (flags & NGX_HTTP_SSI_ADD_PREFIX) {        for (i = 0; i < values.nelts; i++) {            if (size[i] != 0) {                if (*value[i] != '/') {                    for (prefix = r->uri.len; prefix; prefix--) {                        if (r->uri.data[prefix - 1] == '/') {                            len += prefix;                            break;                        }                    }                }                break;            }        }    }    p = ngx_palloc(r->pool, len + ((flags & NGX_HTTP_SSI_ADD_ZERO) ? 1 : 0));    if (p == NULL) {        return NGX_ERROR;    }    text->len = len;    text->data = p;    p = ngx_copy(p, r->uri.data, prefix);    for (i = 0; i < values.nelts; i++) {        p = ngx_copy(p, value[i], size[i]);    }    return NGX_OK;invalid_variable:    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                  "invalid variable name in \"%V\"", text);    return NGX_HTTP_SSI_ERROR;}static ngx_int_tngx_http_ssi_include(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,    ngx_str_t **params){    u_char                      *dst, *src;    size_t                       len;    ngx_int_t                    rc, key;    ngx_str_t                   *uri, *file, *wait, *set, *stub, args;    ngx_buf_t                   *b;    ngx_uint_t                   flags, i;    ngx_chain_t                 *cl, *tl, **ll, *out;    ngx_http_request_t          *sr;    ngx_http_ssi_var_t          *var;    ngx_http_ssi_ctx_t          *mctx;    ngx_http_ssi_block_t        *bl;    ngx_http_post_subrequest_t  *psr;    uri = params[NGX_HTTP_SSI_INCLUDE_VIRTUAL];    file = params[NGX_HTTP_SSI_INCLUDE_FILE];    wait = params[NGX_HTTP_SSI_INCLUDE_WAIT];    set = params[NGX_HTTP_SSI_INCLUDE_SET];    stub = params[NGX_HTTP_SSI_INCLUDE_STUB];    if (uri && file) {

⌨️ 快捷键说明

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