Changeset 6229:2c045e5b8291 in nginx


Ignore:
Timestamp:
08/17/15 14:42:02 (5 years ago)
Author:
Dmitry Volyntsev <xeioex@…>
Branch:
default
Phase:
public
Message:

Sub filter: support of variables in the strings to replace.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/http/modules/ngx_http_sub_filter_module.c

    r6228 r6229  
    1212
    1313typedef struct {
     14    ngx_http_complex_value_t   match;
     15    ngx_http_complex_value_t   value;
     16} ngx_http_sub_pair_t;
     17
     18
     19typedef struct {
    1420    ngx_str_t                  match;
    15     ngx_http_complex_value_t   value;
     21    ngx_http_complex_value_t  *value;
    1622} ngx_http_sub_match_t;
    1723
     
    2733
    2834typedef struct {
     35    ngx_uint_t                 dynamic; /* unsigned dynamic:1; */
     36
     37    ngx_array_t               *pairs;
     38
    2939    ngx_http_sub_tables_t     *tables;
    3040
     
    6272    ngx_int_t                  offset;
    6373    ngx_uint_t                 index;
     74
     75    ngx_http_sub_tables_t     *tables;
     76    ngx_array_t               *matches;
    6477} ngx_http_sub_ctx_t;
    6578
     
    156169ngx_http_sub_header_filter(ngx_http_request_t *r)
    157170{
    158     ngx_http_sub_ctx_t        *ctx;
     171    ngx_str_t                *m;
     172    ngx_uint_t                i, j, n;
     173    ngx_http_sub_ctx_t       *ctx;
     174    ngx_http_sub_pair_t      *pairs;
     175    ngx_http_sub_match_t     *matches;
    159176    ngx_http_sub_loc_conf_t  *slcf;
    160177
    161178    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
    162179
    163     if (slcf->matches == NULL
     180    if (slcf->pairs == NULL
    164181        || r->headers_out.content_length_n == 0
    165182        || ngx_http_test_content_type(r, &slcf->types) == NULL)
     
    173190    }
    174191
    175     ctx->saved.data = ngx_pnalloc(r->pool, slcf->tables->max_match_len - 1);
     192    if (slcf->dynamic == 0) {
     193        ctx->tables = slcf->tables;
     194        ctx->matches = slcf->matches;
     195
     196    } else {
     197        pairs = slcf->pairs->elts;
     198        n = slcf->pairs->nelts;
     199
     200        matches = ngx_pcalloc(r->pool, sizeof(ngx_http_sub_match_t) * n);
     201        if (matches == NULL) {
     202            return NGX_ERROR;
     203        }
     204
     205        j = 0;
     206        for (i = 0; i < n; i++) {
     207            matches[j].value = &pairs[i].value;
     208
     209            if (pairs[i].match.lengths == NULL) {
     210                matches[j].match = pairs[i].match.value;
     211                j++;
     212                continue;
     213            }
     214
     215            m = &matches[j].match;
     216            if (ngx_http_complex_value(r, &pairs[i].match, m) != NGX_OK) {
     217                return NGX_ERROR;
     218            }
     219
     220            if (m->len == 0) {
     221                continue;
     222            }
     223
     224            ngx_strlow(m->data, m->data, m->len);
     225            j++;
     226        }
     227
     228        if (j == 0) {
     229            return ngx_http_next_header_filter(r);
     230        }
     231
     232        ctx->matches = ngx_pnalloc(r->pool, sizeof(ngx_array_t));
     233        if (ctx->matches == NULL) {
     234            return NGX_ERROR;
     235        }
     236
     237        ctx->matches->elts = matches;
     238        ctx->matches->nelts = j;
     239
     240        ctx->tables = ngx_pnalloc(r->pool, sizeof(ngx_http_sub_tables_t));
     241        if (ctx->tables == NULL) {
     242            return NGX_ERROR;
     243        }
     244
     245        ngx_http_sub_init_tables(ctx->tables, ctx->matches->elts,
     246                                 ctx->matches->nelts);
     247    }
     248
     249    ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
     250
     251    ctx->saved.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);
    176252    if (ctx->saved.data == NULL) {
    177253        return NGX_ERROR;
    178254    }
    179255
    180     ctx->looked.data = ngx_pnalloc(r->pool, slcf->tables->max_match_len - 1);
     256    ctx->looked.data = ngx_pnalloc(r->pool, ctx->tables->max_match_len - 1);
    181257    if (ctx->looked.data == NULL) {
    182258        return NGX_ERROR;
    183259    }
    184260
    185     ngx_http_set_ctx(r, ctx, ngx_http_sub_filter_module);
    186 
    187     ctx->offset = slcf->tables->min_match_len - 1;
     261    ctx->offset = ctx->tables->min_match_len - 1;
    188262    ctx->last_out = &ctx->out;
    189263
     
    351425            if (ctx->sub == NULL) {
    352426                ctx->sub = ngx_pcalloc(r->pool, sizeof(ngx_str_t)
    353                                                 * slcf->matches->nelts);
     427                                                * ctx->matches->nelts);
    354428                if (ctx->sub == NULL) {
    355429                    return NGX_ERROR;
     
    360434
    361435            if (sub->data == NULL) {
    362                 match = slcf->matches->elts;
    363 
    364                 if (ngx_http_complex_value(r, &match[ctx->index].value, sub)
     436                match = ctx->matches->elts;
     437
     438                if (ngx_http_complex_value(r, match[ctx->index].value, sub)
    365439                    != NGX_OK)
    366440                {
     
    382456
    383457            ctx->index = 0;
    384             ctx->once = slcf->once && (++ctx->applied == slcf->matches->nelts);
     458            ctx->once = slcf->once && (++ctx->applied == ctx->matches->nelts);
    385459
    386460            continue;
     
    528602
    529603    slcf = ngx_http_get_module_loc_conf(r, ngx_http_sub_filter_module);
    530     tables = slcf->tables;
     604    tables = ctx->tables;
    531605
    532606    offset = ctx->offset;
     
    555629
    556630        start = offset - (ngx_int_t) tables->min_match_len + 1;
    557         match = slcf->matches->elts;
     631        match = ctx->matches->elts;
    558632
    559633        i = ngx_max(tables->index[c], ctx->index);
     
    664738
    665739    ngx_str_t                         *value;
    666     ngx_http_sub_match_t              *match;
     740    ngx_http_sub_pair_t               *pair;
    667741    ngx_http_compile_complex_value_t   ccv;
    668742
     
    674748    }
    675749
    676     if (slcf->matches == NULL) {
    677         slcf->matches = ngx_array_create(cf->pool, 1,
    678                                          sizeof(ngx_http_sub_match_t));
    679         if (slcf->matches == NULL) {
     750    if (slcf->pairs == NULL) {
     751        slcf->pairs = ngx_array_create(cf->pool, 1,
     752                                       sizeof(ngx_http_sub_pair_t));
     753        if (slcf->pairs == NULL) {
    680754            return NGX_CONF_ERROR;
    681755        }
    682756    }
    683757
    684     if (slcf->matches->nelts == 255) {
     758    if (slcf->pairs->nelts == 255) {
    685759        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
    686760                           "number of search patterns exceeds 255");
     
    690764    ngx_strlow(value[1].data, value[1].data, value[1].len);
    691765
    692     match = ngx_array_push(slcf->matches);
    693     if (match == NULL) {
     766    pair = ngx_array_push(slcf->pairs);
     767    if (pair == NULL) {
    694768        return NGX_CONF_ERROR;
    695769    }
    696770
    697     match->match = value[1];
     771    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
     772
     773    ccv.cf = cf;
     774    ccv.value = &value[1];
     775    ccv.complex_value = &pair->match;
     776
     777    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
     778        return NGX_CONF_ERROR;
     779    }
     780
     781    if (ccv.complex_value->lengths != NULL) {
     782        slcf->dynamic = 1;
     783
     784    } else {
     785        ngx_strlow(pair->match.value.data, pair->match.value.data,
     786                   pair->match.value.len);
     787    }
    698788
    699789    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
     
    701791    ccv.cf = cf;
    702792    ccv.value = &value[2];
    703     ccv.complex_value = &match->value;
     793    ccv.complex_value = &pair->value;
    704794
    705795    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
     
    724814     * set by ngx_pcalloc():
    725815     *
     816     *     conf->dynamic = 0;
     817     *     conf->pairs = NULL;
    726818     *     conf->tables = NULL;
    727819     *     conf->types = { NULL };
     
    740832ngx_http_sub_merge_conf(ngx_conf_t *cf, void *parent, void *child)
    741833{
    742     ngx_http_sub_loc_conf_t *prev = parent;
    743     ngx_http_sub_loc_conf_t *conf = child;
     834    ngx_uint_t                i, n;
     835    ngx_http_sub_pair_t      *pairs;
     836    ngx_http_sub_match_t     *matches;
     837    ngx_http_sub_loc_conf_t  *prev = parent;
     838    ngx_http_sub_loc_conf_t  *conf = child;
    744839
    745840    ngx_conf_merge_value(conf->once, prev->once, 1);
     
    754849    }
    755850
    756     if (conf->matches == NULL) {
     851    if (conf->pairs == NULL) {
     852        conf->dynamic = prev->dynamic;
     853        conf->pairs = prev->pairs;
    757854        conf->matches = prev->matches;
    758855        conf->tables = prev->tables;
    759856
    760     } else {
     857    } else if (conf->dynamic == 0){
     858        pairs = conf->pairs->elts;
     859        n = conf->pairs->nelts;
     860
     861        matches = ngx_pnalloc(cf->pool, sizeof(ngx_http_sub_match_t) * n);
     862        if (matches == NULL) {
     863            return NGX_CONF_ERROR;
     864        }
     865
     866        for (i = 0; i < n; i++) {
     867            matches[i].match = pairs[i].match.value;
     868            matches[i].value = &pairs[i].value;
     869        }
     870
     871        conf->matches = ngx_pnalloc(cf->pool, sizeof(ngx_array_t));
     872        if (conf->matches == NULL) {
     873            return NGX_CONF_ERROR;
     874        }
     875
     876        conf->matches->elts = matches;
     877        conf->matches->nelts = n;
     878
    761879        conf->tables = ngx_palloc(cf->pool, sizeof(ngx_http_sub_tables_t));
    762880        if (conf->tables == NULL) {
Note: See TracChangeset for help on using the changeset viewer.