142
141
key = ngx_hash(key, name[i]);
147
if (map->hash.buckets) {
148
value = ngx_hash_find(&map->hash, key, name, len);
144
value = ngx_hash_find_combined(&map->hash, key, name, len);
155
if (map->dns_wildcards && map->dns_wildcards->hash.buckets) {
156
value = ngx_hash_find_wildcard(map->dns_wildcards, name, len);
161
*v = *map->default_value;
165
*v = *map->default_value;
150
*v = *map->default_value;
169
153
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
170
"http map: \"%V\" \"%V\"", vv, v);
154
"http map: \"%v\" \"%v\"", vv, v);
269
map->default_value = ctx.default_value ? ctx.default_value:
270
&ngx_http_variable_null_value;
285
272
hash.key = ngx_hash_key_lc;
286
273
hash.max_size = mcf->hash_max_size;
287
274
hash.bucket_size = mcf->hash_bucket_size;
303
map->default_value = ctx.default_value ? ctx.default_value:
304
&ngx_http_variable_null_value;
306
if (ctx.keys.dns_wildcards.nelts) {
308
ngx_qsort(ctx.keys.dns_wildcards.elts,
309
(size_t) ctx.keys.dns_wildcards.nelts,
310
sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);
313
hash.temp_pool = pool;
315
if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wildcards.elts,
316
ctx.keys.dns_wildcards.nelts)
319
ngx_destroy_pool(pool);
320
return NGX_CONF_ERROR;
323
map->dns_wildcards = (ngx_hash_wildcard_t *) hash.hash;
290
if (ctx.keys.dns_wc_head.nelts) {
292
ngx_qsort(ctx.keys.dns_wc_head.elts,
293
(size_t) ctx.keys.dns_wc_head.nelts,
294
sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);
297
hash.temp_pool = pool;
299
if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts,
300
ctx.keys.dns_wc_head.nelts)
303
ngx_destroy_pool(pool);
304
return NGX_CONF_ERROR;
307
map->hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;
310
if (ctx.keys.dns_wc_tail.nelts) {
312
ngx_qsort(ctx.keys.dns_wc_tail.elts,
313
(size_t) ctx.keys.dns_wc_tail.nelts,
314
sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards);
317
hash.temp_pool = pool;
319
if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts,
320
ctx.keys.dns_wc_tail.nelts)
323
ngx_destroy_pool(pool);
324
return NGX_CONF_ERROR;
327
map->hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;
326
330
ngx_destroy_pool(pool);
345
349
ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
349
352
ngx_str_t *value, file;
350
ngx_uint_t i, key, flags;
351
354
ngx_http_map_conf_ctx_t *ctx;
352
355
ngx_http_variable_value_t *var, **vp;
442
ch = value[0].data[0];
444
if ((ch != '*' && ch != '.') || ctx->hostnames == 0) {
446
if (ngx_strcmp(value[0].data, "default") == 0) {
448
if (ctx->default_value) {
449
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
450
"duplicate default map parameter");
451
return NGX_CONF_ERROR;
454
ctx->default_value = var;
459
if (value[0].len && ch == '!') {
468
if ((ch == '*' && (value[0].len < 3 || value[0].data[1] != '.'))
469
|| (ch == '.' && value[0].len < 2))
445
if (ngx_strcmp(value[0].data, "default") == 0) {
447
if (ctx->default_value) {
471
448
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
472
"invalid DNS wildcard \"%V\"", &value[0]);
449
"duplicate default map parameter");
474
450
return NGX_CONF_ERROR;
477
flags = NGX_HASH_WILDCARD_KEY;
480
rc = ngx_hash_add_key(&ctx->keys, &value[0], var, flags);
453
ctx->default_value = var;
458
if (value[0].len && value[0].data[0] == '!') {
463
rc = ngx_hash_add_key(&ctx->keys, &value[0], var,
464
(ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0);
482
466
if (rc == NGX_OK) {
483
467
return NGX_CONF_OK;
470
if (rc == NGX_DECLINED) {
471
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
472
"invalid hostname or wildcard \"%V\"", &value[0]);
486
475
if (rc == NGX_BUSY) {
487
476
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
488
477
"conflicting parameter \"%V\"", &value[0]);