comparison src/core/ngx_hash.c @ 509:9b8c906f6e63 release-0.1.29

nginx-0.1.29-RELEASE import *) Feature: the ngx_http_ssi_module supports "include virtual" command. *) Feature: the ngx_http_ssi_module supports the condition command like 'if expr="$NAME"' and "else" and "endif" commands. Only one nested level is supported. *) Feature: the ngx_http_ssi_module supports the DATE_LOCAL and DATE_GMT variables and "config timefmt" command. *) Feature: the "ssi_ignore_recycled_buffers" directive. *) Bugfix: the "echo" command did not show the default value for the empty QUERY_STRING variable. *) Change: the ngx_http_proxy_module was rewritten. *) Feature: the "proxy_redirect", "proxy_pass_request_headers", "proxy_pass_request_body", and "proxy_method" directives. *) Feature: the "proxy_set_header" directive. The "proxy_x_var" was canceled and must be replaced with the proxy_set_header directive. *) Change: the "proxy_preserve_host" is canceled and must be replaced with the "proxy_set_header Host $host" and the "proxy_redirect off" directives, the "proxy_set_header Host $host:$proxy_port" directive and the appropriate proxy_redirect directives. *) Change: the "proxy_set_x_real_ip" is canceled and must be replaced with the "proxy_set_header X-Real-IP $remote_addr" directive. *) Change: the "proxy_add_x_forwarded_for" is canceled and must be replaced with the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for" directive. *) Change: the "proxy_set_x_url" is canceled and must be replaced with the "proxy_set_header X-URL http://$host:$server_port$request_uri" directive. *) Feature: the "fastcgi_param" directive. *) Change: the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params" directive are canceled and must be replaced with the fastcgi_param directives. *) Feature: the "index" directive can use the variables. *) Feature: the "index" directive can be used at http and server levels. *) Change: the last index only in the "index" directive can be absolute. *) Feature: the "rewrite" directive can use the variables. *) Feature: the "internal" directive. *) Feature: the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME, REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables. *) Change: nginx now passes the invalid lines in a client request headers or a backend response header. *) Bugfix: if the backend did not transfer response for a long time and the "send_timeout" was less than "proxy_read_timeout", then nginx returned the 408 response. *) Bugfix: the segmentation fault was occurred if the backend sent an invalid line in response header; the bug had appeared in 0.1.26. *) Bugfix: the segmentation fault may occurred in FastCGI fault tolerance configuration. *) Bugfix: the "expires" directive did not remove the previous "Expires" and "Cache-Control" headers. *) Bugfix: nginx did not take into account trailing dot in "Host" header line. *) Bugfix: the ngx_http_auth_module did not work under Linux. *) Bugfix: the rewrite directive worked incorrectly, if the arguments were in a request. *) Bugfix: nginx could not be built on MacOS X.
author Igor Sysoev <igor@sysoev.ru>
date Thu, 12 May 2005 14:58:06 +0000
parents cd3117ad9aab
children 4e296b7d25bf
comparison
equal deleted inserted replaced
508:ca1020ce99ba 509:9b8c906f6e63
7 #include <ngx_config.h> 7 #include <ngx_config.h>
8 #include <ngx_core.h> 8 #include <ngx_core.h>
9 9
10 10
11 ngx_int_t 11 ngx_int_t
12 ngx_hash_init(ngx_hash_t *hash, ngx_pool_t *pool, void *names) 12 ngx_hash_init(ngx_hash_t *hash, ngx_pool_t *pool, void *names, ngx_uint_t nelts)
13 { 13 {
14 u_char *p; 14 u_char *p;
15 ngx_str_t *n, *bucket; 15 ngx_str_t *name, *bucket;
16 ngx_uint_t i, key, size, best, *test, buckets, min_buckets; 16 ngx_uint_t i, n, key, size, best, *test, buckets, min_buckets;
17
18 if (nelts == 0) {
19 for (name = (ngx_str_t *) names;
20 name->len;
21 name = (ngx_str_t *) ((char *) name + hash->bucket_size))
22 {
23 nelts++;
24 }
25 }
17 26
18 test = ngx_alloc(hash->max_size * sizeof(ngx_uint_t), pool->log); 27 test = ngx_alloc(hash->max_size * sizeof(ngx_uint_t), pool->log);
19 if (test == NULL) { 28 if (test == NULL) {
20 return NGX_ERROR; 29 return NGX_ERROR;
21 } 30 }
32 41
33 for (i = 0; i < size; i++) { 42 for (i = 0; i < size; i++) {
34 test[i] = 0; 43 test[i] = 0;
35 } 44 }
36 45
37 for (n = (ngx_str_t *) names; 46 for (n = 0, name = (ngx_str_t *) names;
38 n->len; 47 n < nelts;
39 n = (ngx_str_t *) ((char *) n + hash->bucket_size)) 48 n++, name = (ngx_str_t *) ((char *) name + hash->bucket_size))
40 { 49 {
41 key = 0; 50 key = 0;
42 51
43 for (i = 0; i < n->len; i++) { 52 for (i = 0; i < name->len; i++) {
44 key += ngx_tolower(n->data[i]); 53 key += ngx_tolower(name->data[i]);
45 } 54 }
46 55
47 key %= size; 56 key %= size;
48 57
49 if (test[key] == hash->bucket_limit) { 58 if (test[key] == hash->bucket_limit) {
55 if (buckets < test[key]) { 64 if (buckets < test[key]) {
56 buckets = test[key]; 65 buckets = test[key];
57 } 66 }
58 } 67 }
59 68
60 if (n->len == 0) { 69 if (n == nelts) {
61 if (min_buckets > buckets) { 70 if (min_buckets > buckets) {
62 min_buckets = buckets; 71 min_buckets = buckets;
63 best = size; 72 best = size;
64 } 73 }
65 74
89 98
90 for (i = 0; i < best; i++) { 99 for (i = 0; i < best; i++) {
91 test[i] = 0; 100 test[i] = 0;
92 } 101 }
93 102
94 for (n = (ngx_str_t *) names; 103 for (n = 0, name = (ngx_str_t *) names;
95 n->len; 104 n < nelts;
96 n = (ngx_str_t *) ((char *) n + hash->bucket_size)) 105 n++, name = (ngx_str_t *) ((char *) name + hash->bucket_size))
97 { 106 {
98 key = 0; 107 key = 0;
99 108
100 for (i = 0; i < n->len; i++) { 109 for (i = 0; i < name->len; i++) {
101 key += ngx_tolower(n->data[i]); 110 key += ngx_tolower(name->data[i]);
102 } 111 }
103 112
104 key %= best; 113 key %= best;
105 114
106 test[key]++; 115 test[key]++;
120 hash->buckets[i] = bucket; 129 hash->buckets[i] = bucket;
121 bucket->len = 0; 130 bucket->len = 0;
122 } 131 }
123 } 132 }
124 133
125 for (n = (ngx_str_t *) names; 134 for (n = 0, name = (ngx_str_t *) names;
126 n->len; 135 n < nelts;
127 n = (ngx_str_t *) ((char *) n + hash->bucket_size)) 136 n++, name = (ngx_str_t *) ((char *) name + hash->bucket_size))
128 { 137 {
129 key = 0; 138 key = 0;
130 139
131 for (i = 0; i < n->len; i++) { 140 for (i = 0; i < name->len; i++) {
132 key += ngx_tolower(n->data[i]); 141 key += ngx_tolower(name->data[i]);
133 } 142 }
134 143
135 key %= best; 144 key %= best;
136 145
137 if (hash->bucket_limit == 1) { 146 if (hash->bucket_limit == 1) {
138 p = (u_char *) hash->buckets + key * hash->bucket_size; 147 p = (u_char *) hash->buckets + key * hash->bucket_size;
139 ngx_memcpy(p, n, hash->bucket_size); 148 ngx_memcpy(p, name, hash->bucket_size);
140 continue; 149 continue;
141 } 150 }
142 151
143 for (bucket = hash->buckets[key]; 152 for (bucket = hash->buckets[key];
144 bucket->len; 153 bucket->len;
145 bucket = (ngx_str_t *) ((char *) bucket + hash->bucket_size)) 154 bucket = (ngx_str_t *) ((char *) bucket + hash->bucket_size))
146 { 155 {
147 bucket->len &= 0x7fffffff; 156 bucket->len &= 0x7fffffff;
148 } 157 }
149 158
150 ngx_memcpy(bucket, n, hash->bucket_size); 159 ngx_memcpy(bucket, name, hash->bucket_size);
151 bucket->len |= 0x80000000; 160 bucket->len |= 0x80000000;
152 } 161 }
153 162
154 ngx_free(test); 163 ngx_free(test);
155 164