comparison src/core/ngx_hash.c @ 140:55a211e5eeb7 NGINX_0_3_17

nginx 0.3.17 *) Change: now on Linux configure checks the presence of epoll and sendfile64() in kernel. *) Feature: the "map" directive supports domain names in the ".domain.tld" form. *) Bugfix: the timeouts were not used in SSL handshake; bug appeared in 0.2.4. *) Bugfix: in the HTTPS protocol in the "proxy_pass" directive. *) Bugfix: when the HTTPS protocol was used in the "proxy_pass" directive the port 80 was used by default.
author Igor Sysoev <http://sysoev.ru>
date Sun, 18 Dec 2005 00:00:00 +0300
parents 8e6d4d96ec4c
children 84910468f6de
comparison
equal deleted inserted replaced
139:9cee8bc94578 140:55a211e5eeb7
74 } 74 }
75 75
76 n--; 76 n--;
77 } 77 }
78 78
79 if (n == 0) {
80 return NULL;
81 }
82
83 key = 0; 79 key = 0;
84 80
85 for (i = n; i < len; i++) { 81 for (i = n; i < len; i++) {
86 key = ngx_hash(key, name[i]); 82 key = ngx_hash(key, name[i]);
87 } 83 }
91 #endif 87 #endif
92 88
93 value = ngx_hash_find(&hwc->hash, key, &name[n], len - n); 89 value = ngx_hash_find(&hwc->hash, key, &name[n], len - n);
94 90
95 if (value) { 91 if (value) {
92
93 /*
94 * the 2 low bits of value have the special meaning:
95 * 00 - value is data pointer,
96 * 01 - value is pointer to wildcard hash allowing
97 * "*.example.com" only,
98 * 11 - value is pointer to wildcard hash allowing
99 * both "example.com" and "*.example.com".
100 */
101
96 if ((uintptr_t) value & 1) { 102 if ((uintptr_t) value & 1) {
97 hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~1); 103
104 hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3);
105
106 if (n == 0) {
107 if ((uintptr_t) value & 2) {
108 return hwc->value;
109
110 } else {
111 return NULL;
112 }
113 }
98 114
99 value = ngx_hash_find_wildcard(hwc, name, n - 1); 115 value = ngx_hash_find_wildcard(hwc, name, n - 1);
100 116
101 if (value) { 117 if (value) {
102 return value; 118 return value;
330 ngx_int_t 346 ngx_int_t
331 ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, 347 ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,
332 ngx_uint_t nelts) 348 ngx_uint_t nelts)
333 { 349 {
334 size_t len; 350 size_t len;
335 ngx_uint_t i, n; 351 ngx_uint_t i, n, dot;
336 ngx_array_t curr_names, next_names; 352 ngx_array_t curr_names, next_names;
337 ngx_hash_key_t *name, *next_name; 353 ngx_hash_key_t *name, *next_name;
338 ngx_hash_init_t h; 354 ngx_hash_init_t h;
339 ngx_hash_wildcard_t *wdc; 355 ngx_hash_wildcard_t *wdc;
340 356
357 #if 0 373 #if 0
358 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, 374 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,
359 "wc0: \"%V\"", &names[n].key); 375 "wc0: \"%V\"", &names[n].key);
360 #endif 376 #endif
361 377
378 dot = 0;
379
362 for (len = 0; len < names[n].key.len; len++) { 380 for (len = 0; len < names[n].key.len; len++) {
363 if (names[n].key.data[len] == '.') { 381 if (names[n].key.data[len] == '.') {
364 len++; 382 dot = 1;
365 break; 383 break;
366 } 384 }
367 } 385 }
368 386
369 name = ngx_array_push(&curr_names); 387 name = ngx_array_push(&curr_names);
370 if (name == NULL) { 388 if (name == NULL) {
371 return NGX_ERROR; 389 return NGX_ERROR;
372 } 390 }
373 391
374 name->key.len = len - 1; 392 name->key.len = len;
375 name->key.data = names[n].key.data; 393 name->key.data = names[n].key.data;
376 name->key_hash = hinit->key(name->key.data, name->key.len); 394 name->key_hash = hinit->key(name->key.data, name->key.len);
377 name->value = names[n].value; 395 name->value = names[n].value;
378 396
379 #if 0 397 #if 0
380 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, 398 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,
381 "wc1: \"%V\"", &name->key); 399 "wc1: \"%V\"", &name->key);
382 #endif 400 #endif
401
402 if (dot) {
403 len++;
404 }
383 405
384 next_names.nelts = 0; 406 next_names.nelts = 0;
385 407
386 if (names[n].key.len != len) { 408 if (names[n].key.len != len) {
387 next_name = ngx_array_push(&next_names); 409 next_name = ngx_array_push(&next_names);
415 next_name->key_hash= 0; 437 next_name->key_hash= 0;
416 next_name->value = names[i].value; 438 next_name->value = names[i].value;
417 439
418 #if 0 440 #if 0
419 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, 441 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,
420 "wc2: \"%V\"", &next_name->key); 442 "wc3: \"%V\"", &next_name->key);
421 #endif 443 #endif
422 } 444 }
423 445
424 if (next_names.nelts) { 446 if (next_names.nelts) {
425 h = *hinit; 447 h = *hinit;
440 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, 462 ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0,
441 "wdc: \"%V\"", wdc->value); 463 "wdc: \"%V\"", wdc->value);
442 #endif 464 #endif
443 } 465 }
444 466
445 name->value = (void *) ((uintptr_t) wdc | 1); 467 name->value = (void *) ((uintptr_t) wdc | (dot ? 1 : 3));
446 } 468 }
447 } 469 }
448 470
449 if (ngx_hash_init(hinit, (ngx_hash_key_t *) curr_names.elts, 471 if (ngx_hash_init(hinit, (ngx_hash_key_t *) curr_names.elts,
450 curr_names.nelts) 472 curr_names.nelts)