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

📄 nginx.xs

📁 nginx安装说明文档
💻 XS
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) Igor Sysoev */#define PERL_NO_GET_CONTEXT#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>#include <ngx_http_perl_module.h>#include "XSUB.h"#define ngx_http_perl_set_request(r)                                          \    r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0))))#define ngx_http_perl_set_targ(p, len, z)                                     \                                                                              \    sv_upgrade(TARG, SVt_PV);                                                 \    SvPOK_on(TARG);                                                           \    SvPV_set(TARG, (char *) p);                                               \    SvLEN_set(TARG, len + z);                                                 \    SvCUR_set(TARG, len);                                                     \    SvFAKE_on(TARG);                                                          \    SvREADONLY_on(TARG);                                                      \static ngx_int_tngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv){    u_char  *p;    STRLEN   len;    if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PV) {        sv = SvRV(sv);    }    p = (u_char *) SvPV(sv, len);    s->len = len;    if (SvREADONLY(sv)) {        s->data = p;        return NGX_OK;    }    s->data = ngx_palloc(r->pool, len);    if (s->data == NULL) {        return NGX_ERROR;    }    ngx_memcpy(s->data, p, len);    return NGX_OK;}static ngx_int_tngx_http_perl_output(ngx_http_request_t *r, ngx_buf_t *b){    ngx_chain_t           out;#if (NGX_HTTP_SSI)    ngx_chain_t          *cl;    ngx_http_perl_ctx_t  *ctx;    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);    if (ctx->ssi) {        cl = ngx_alloc_chain_link(r->pool);        if (cl == NULL) {            return NGX_ERROR;        }        cl->buf = b;        cl->next = NULL;        *ctx->ssi->last_out = cl;        ctx->ssi->last_out = &cl->next;        return NGX_OK;    }#endif    out.buf = b;    out.next = NULL;    return ngx_http_output_filter(r, &out);}MODULE = nginx    PACKAGE = nginxvoidstatus(r, code)    CODE:    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    r->headers_out.status = SvIV(ST(1));    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,                   "perl status: %d", r->headers_out.status);    XSRETURN_UNDEF;voidsend_http_header(r, ...)    CODE:    ngx_http_request_t  *r;    SV                  *sv;    ngx_http_perl_set_request(r);    if (r->headers_out.status == 0) {        r->headers_out.status = NGX_HTTP_OK;    }    if (items != 1) {        sv = ST(1);        if (ngx_http_perl_sv2str(aTHX_ r, &r->headers_out.content_type, sv)            != NGX_OK)        {            XSRETURN_EMPTY;        }    } else {        if (ngx_http_set_content_type(r) != NGX_OK) {            XSRETURN_EMPTY;        }    }    (void) ngx_http_send_header(r);voidheader_only(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    sv_upgrade(TARG, SVt_IV);    sv_setiv(TARG, r->header_only);    ST(0) = TARG;voiduri(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    ngx_http_perl_set_targ(r->uri.data, r->uri.len, 0);    ST(0) = TARG;voidargs(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    ngx_http_perl_set_targ(r->args.data, r->args.len, 0);    ST(0) = TARG;voidrequest_method(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    ngx_http_perl_set_targ(r->method_name.data, r->method_name.len, 0);    ST(0) = TARG;voidremote_addr(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    ngx_http_perl_set_targ(r->connection->addr_text.data,                           r->connection->addr_text.len, 1);    ST(0) = TARG;voidheader_in(r, key)    CODE:    dXSTARG;    ngx_http_request_t         *r;    SV                         *key;    u_char                     *p, *lowcase_key, *cookie;    STRLEN                      len;    ssize_t                     size;    ngx_uint_t                  i, n, hash;    ngx_list_part_t            *part;    ngx_table_elt_t            *h, **ph;    ngx_http_header_t          *hh;    ngx_http_core_main_conf_t  *cmcf;    ngx_http_perl_set_request(r);    key = ST(1);    if (SvROK(key) && SvTYPE(SvRV(key)) == SVt_PV) {        key = SvRV(key);    }    p = (u_char *) SvPV(key, len);    /* look up hashed headers */    lowcase_key = ngx_palloc(r->pool, len);    if (lowcase_key == NULL) {        XSRETURN_UNDEF;    }    hash = 0;    for (i = 0; i < len; i++) {        lowcase_key[i] = ngx_tolower(p[i]);        hash = ngx_hash(hash, lowcase_key[i]);    }    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);    hh = ngx_hash_find(&cmcf->headers_in_hash, hash, lowcase_key, len);    if (hh) {        if (hh->offset) {            ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);            if (*ph) {                ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0);                goto done;            }            XSRETURN_UNDEF;        }        /* Cookie */        n = r->headers_in.cookies.nelts;        if (n == 0) {            XSRETURN_UNDEF;        }        ph = r->headers_in.cookies.elts;        if (n == 1) {            ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0);            goto done;        }        size = - (ssize_t) (sizeof("; ") - 1);        for (i = 0; i < n; i++) {            size += ph[i]->value.len + sizeof("; ") - 1;        }        cookie = ngx_palloc(r->pool, size);        if (cookie == NULL) {            XSRETURN_UNDEF;        }        p = cookie;        for (i = 0; /* void */ ; i++) {            p = ngx_copy(p, ph[i]->value.data, ph[i]->value.len);            if (i == n - 1) {                break;            }            *p++ = ';'; *p++ = ' ';        }        ngx_http_perl_set_targ(cookie, size, 0);        goto done;    }    /* iterate over all headers */    part = &r->headers_in.headers.part;    h = part->elts;    for (i = 0; /* void */ ; i++) {        if (i >= part->nelts) {            if (part->next == NULL) {                break;            }            part = part->next;            h = part->elts;            i = 0;        }        if (len != h[i].key.len            || ngx_strcasecmp(p, h[i].key.data) != 0)        {            continue;        }        ngx_http_perl_set_targ(h[i].value.data, h[i].value.len, 0);        goto done;    }    XSRETURN_UNDEF;    done:    ST(0) = TARG;voidhas_request_body(r, next)    CODE:    dXSTARG;    ngx_http_request_t   *r;    ngx_http_perl_ctx_t  *ctx;    ngx_http_perl_set_request(r);    if (r->headers_in.content_length_n <= 0) {        XSRETURN_UNDEF;    }    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);    ctx->next = SvRV(ST(1));    r->request_body_in_single_buf = 1;    r->request_body_in_persistent_file = 1;    r->request_body_in_clean_file = 1;    if (r->request_body_in_file_only) {        r->request_body_file_log_level = 0;    }    ngx_http_read_client_request_body(r, ngx_http_perl_handle_request);    sv_upgrade(TARG, SVt_IV);    sv_setiv(TARG, 1);    ST(0) = TARG;voidrequest_body(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    size_t               len;    ngx_http_perl_set_request(r);    if (r->request_body == NULL        || r->request_body->temp_file        || r->request_body->bufs == NULL)    {        XSRETURN_UNDEF;    }    len = r->request_body->bufs->buf->last - r->request_body->bufs->buf->pos;    if (len == 0) {        XSRETURN_UNDEF;    }    ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len, 0);    ST(0) = TARG;voidrequest_body_file(r)    CODE:    dXSTARG;    ngx_http_request_t  *r;    ngx_http_perl_set_request(r);    if (r->request_body == NULL || r->request_body->temp_file == NULL) {        XSRETURN_UNDEF;    }    ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data,                           r->request_body->temp_file->file.name.len, 1);    ST(0) = TARG;voidheader_out(r, key, value)    CODE:    ngx_http_request_t  *r;    SV                  *key;    SV                  *value;    ngx_table_elt_t     *header;    ngx_http_perl_set_request(r);    key = ST(1);    value = ST(2);    header = ngx_list_push(&r->headers_out.headers);    if (header == NULL) {        XSRETURN_EMPTY;    }    header->hash = 1;    if (ngx_http_perl_sv2str(aTHX_ r, &header->key, key) != NGX_OK) {        XSRETURN_EMPTY;    }    if (ngx_http_perl_sv2str(aTHX_ r, &header->value, value) != NGX_OK) {        XSRETURN_EMPTY;    }    if (header->key.len == sizeof("Content-Length") - 1        && ngx_strncasecmp(header->key.data, "Content-Length",                           sizeof("Content-Length") - 1) == 0)    {        r->headers_out.content_length_n = (off_t) SvIV(value);        r->headers_out.content_length = header;    }    XSRETURN_EMPTY;voidfilename(r)    CODE:    dXSTARG;    size_t                root;    ngx_http_request_t   *r;    ngx_http_perl_ctx_t  *ctx;    ngx_http_perl_set_request(r);    ctx = ngx_http_get_module_ctx(r, ngx_http_perl_module);    if (ctx->filename.data) {        goto done;    }    if (ngx_http_map_uri_to_path(r, &ctx->filename, &root, 0) == NULL) {        XSRETURN_UNDEF;    }    ctx->filename.len--;    sv_setpv(PL_statname, (char *) ctx->filename.data);    done:

⌨️ 快捷键说明

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