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

📄 ngx_http_charset_filter_module.c

📁 nginx 反向代理0.7.1版本 用于实现反向代理
💻 C
📖 第 1 页 / 共 3 页
字号:
#endif            ctx->busy = cl->next;            if (b->tag != (ngx_buf_tag_t) &ngx_http_charset_filter_module) {                continue;            }            if (b->shadow) {                b->shadow->pos = b->shadow->last;            }            if (b->pos) {                cl->next = ctx->free_buffers;                ctx->free_buffers = cl;                continue;            }            cl->next = ctx->free_bufs;            ctx->free_bufs = cl;        }        return rc;    }    for (cl = in; cl; cl = cl->next) {        (void) ngx_http_charset_recode(cl->buf, ctx->table);    }    return ngx_http_next_body_filter(r, in);}static ngx_uint_tngx_http_charset_recode(ngx_buf_t *b, u_char *table){    u_char  *p, *last;    last = b->last;    for (p = b->pos; p < last; p++) {        if (*p != table[*p]) {            goto recode;        }    }    return 0;recode:    do {        if (*p != table[*p]) {            *p = table[*p];        }        p++;    } while (p < last);    b->in_file = 0;    return 1;}static ngx_chain_t *ngx_http_charset_recode_from_utf8(ngx_pool_t *pool, ngx_buf_t *buf,    ngx_http_charset_ctx_t *ctx){    size_t        len, size;    u_char        c, *p, *src, *dst, *saved, **table;    uint32_t      n;    ngx_buf_t    *b;    ngx_uint_t    i;    ngx_chain_t  *out, *cl, **ll;    src = buf->pos;    if (ctx->saved_len == 0) {        for ( /* void */ ; src < buf->last; src++) {            if (*src < 0x80) {                continue;            }            len = src - buf->pos;            if (len > 512) {                out = ngx_http_charset_get_buf(pool, ctx);                if (out == NULL) {                    return NULL;                }                b = out->buf;                b->temporary = buf->temporary;                b->memory = buf->memory;                b->mmap = buf->mmap;                b->flush = buf->flush;                b->pos = buf->pos;                b->last = src;                out->buf = b;                out->next = NULL;                size = buf->last - src;                saved = src;                n = ngx_utf_decode(&saved, size);                if (n == 0xfffffffe) {                    /* incomplete UTF-8 symbol */                    ngx_memcpy(ctx->saved, src, size);                    ctx->saved_len = size;                    b->shadow = buf;                    return out;                }            } else {                out = NULL;                size = len + buf->last - src;                src = buf->pos;            }            if (size < NGX_HTML_ENTITY_LEN) {                size += NGX_HTML_ENTITY_LEN;            }            cl = ngx_http_charset_get_buffer(pool, ctx, size);            if (cl == NULL) {                return NULL;            }            if (out) {                out->next = cl;            } else {                out = cl;            }            b = cl->buf;            dst = b->pos;            goto recode;        }        out = ngx_alloc_chain_link(pool);        if (out == NULL) {            return NULL;        }        out->buf = buf;        out->next = NULL;        return out;    }    /* process incomplete UTF sequence from previous buffer */    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0,                   "http charset utf saved: %z", ctx->saved_len);    p = src;    for (i = ctx->saved_len; i < NGX_UTF_LEN; i++) {        ctx->saved[i] = *p++;        if (p == buf->last) {            break;        }    }    saved = ctx->saved;    n = ngx_utf_decode(&saved, i);    c = '\0';    if (n < 0x10000) {        table = (u_char **) ctx->table;        p = table[n >> 8];        if (p) {            c = p[n & 0xff];        }    } else if (n == 0xfffffffe) {        /* incomplete UTF-8 symbol */        if (i < NGX_UTF_LEN) {            out = ngx_http_charset_get_buf(pool, ctx);            if (out == NULL) {                return NULL;            }            b = out->buf;            b->pos = buf->pos;            b->last = buf->last;            b->sync = 1;            b->shadow = buf;            ngx_memcpy(&ctx->saved[ctx->saved_len], src, i);            ctx->saved_len += i;            return out;        }    }    size = buf->last - buf->pos;    if (size < NGX_HTML_ENTITY_LEN) {        size += NGX_HTML_ENTITY_LEN;    }    cl = ngx_http_charset_get_buffer(pool, ctx, size);    if (cl == NULL) {        return NULL;    }    out = cl;    b = cl->buf;    dst = b->pos;    if (c) {        *dst++ = c;    } else if (n == 0xfffffffe) {        *dst++ = '?';        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,                       "http charset invalid utf 0");        saved = &ctx->saved[NGX_UTF_LEN];    } else if (n > 0x10ffff) {        *dst++ = '?';        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,                       "http charset invalid utf 1");    } else {        dst = ngx_sprintf(dst, "&#%uD;", n);    }    src += (saved - ctx->saved) - ctx->saved_len;    ctx->saved_len = 0;recode:    ll = &cl->next;    table = (u_char **) ctx->table;    while (src < buf->last) {        if ((size_t) (b->end - dst) < NGX_HTML_ENTITY_LEN) {            b->last = dst;            size = buf->last - src + NGX_HTML_ENTITY_LEN;            cl = ngx_http_charset_get_buffer(pool, ctx, size);            if (cl == NULL) {                return NULL;            }            *ll = cl;            ll = &cl->next;            b = cl->buf;            dst = b->pos;        }        if (*src < 0x80) {            *dst++ = *src++;            continue;        }        len = buf->last - src;        n = ngx_utf_decode(&src, len);        if (n < 0x10000) {            p = table[n >> 8];            if (p) {                c = p[n & 0xff];                if (c) {                    *dst++ = c;                    continue;                }            }            dst = ngx_sprintf(dst, "&#%uD;", n);            continue;        }        if (n == 0xfffffffe) {            /* incomplete UTF-8 symbol */            ngx_memcpy(ctx->saved, src, len);            ctx->saved_len = len;            if (b->pos == dst) {                b->sync = 1;                b->temporary = 0;            }            break;        }        if (n > 0x10ffff) {            *dst++ = '?';            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0,                           "http charset invalid utf 2");            continue;        }        /* n > 0xffff */        dst = ngx_sprintf(dst, "&#%uD;", n);    }    b->last = dst;    b->last_buf = buf->last_buf;    b->last_in_chain = buf->last_in_chain;    b->flush = buf->flush;    b->shadow = buf;    return out;}static ngx_chain_t *ngx_http_charset_recode_to_utf8(ngx_pool_t *pool, ngx_buf_t *buf,    ngx_http_charset_ctx_t *ctx){    size_t        len, size;    u_char       *p, *src, *dst, *table;    ngx_buf_t    *b;    ngx_chain_t  *out, *cl, **ll;    table = ctx->table;    for (src = buf->pos; src < buf->last; src++) {        if (table[*src * NGX_UTF_LEN] == '\1') {            continue;        }        goto recode;    }    out = ngx_alloc_chain_link(pool);    if (out == NULL) {        return NULL;    }    out->buf = buf;    out->next = NULL;    return out;recode:    /*     * we assume that there are about half of characters to be recoded,     * so we preallocate "size / 2 + size / 2 * ctx->length"     */    len = src - buf->pos;    if (len > 512) {        out = ngx_http_charset_get_buf(pool, ctx);        if (out == NULL) {            return NULL;        }        b = out->buf;        b->temporary = buf->temporary;        b->memory = buf->memory;        b->mmap = buf->mmap;        b->flush = buf->flush;        b->pos = buf->pos;        b->last = src;        out->buf = b;        out->next = NULL;        size = buf->last - src;        size = size / 2 + size / 2 * ctx->length;    } else {        out = NULL;        size = buf->last - src;        size = len + size / 2 + size / 2 * ctx->length;        src = buf->pos;    }    cl = ngx_http_charset_get_buffer(pool, ctx, size);    if (cl == NULL) {        return NULL;    }    if (out) {        out->next = cl;    } else {        out = cl;    }    ll = &cl->next;    b = cl->buf;    dst = b->pos;    while (src < buf->last) {        p = &table[*src++ * NGX_UTF_LEN];        len = *p++;        if ((size_t) (b->end - dst) < len) {            b->last = dst;            size = buf->last - src;            size = len + size / 2 + size / 2 * ctx->length;            cl = ngx_http_charset_get_buffer(pool, ctx, size);            if (cl == NULL) {                return NULL;            }            *ll = cl;            ll = &cl->next;            b = cl->buf;            dst = b->pos;        }        while (len) {            *dst++ = *p++;            len--;        }    }    b->last = dst;    b->last_buf = buf->last_buf;    b->last_in_chain = buf->last_in_chain;    b->flush = buf->flush;    b->shadow = buf;    return out;}static ngx_chain_t *ngx_http_charset_get_buf(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx){    ngx_chain_t  *cl;    cl = ctx->free_bufs;    if (cl) {        ctx->free_bufs = cl->next;        cl->buf->shadow = NULL;        cl->next = NULL;        return cl;    }    cl = ngx_alloc_chain_link(pool);    if (cl == NULL) {        return NULL;    }    cl->buf = ngx_calloc_buf(pool);    if (cl->buf == NULL) {        return NULL;    }    cl->next = NULL;    cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module;    return cl;}static ngx_chain_t *ngx_http_charset_get_buffer(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx,    size_t size){    ngx_buf_t    *b;    ngx_chain_t  *cl, **ll;    for (ll = &ctx->free_buffers, cl = ctx->free_buffers;         cl;         ll = &cl->next, cl = cl->next)    {        b = cl->buf;        if ((size_t) (b->end - b->start) >= size) {            *ll = cl->next;            cl->next = NULL;            b->pos = b->start;            b->temporary = 1;

⌨️ 快捷键说明

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