Mercurial > hg > nginx-vendor-0-7
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) |