Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_geo_module.c @ 5161:a5f7d455e271 stable-1.2
Merge of r5130, r5131, r5132: support for Mercurial repositories.
*) Misc: switch to single export operation in "zip" target.
While exporting parts of the tree might be better in some cases, it
is awfully slow overseas, and also requires unlocking ssh key multiple
times. Exporting the whole repo and removing directories not needed for
zip is faster here.
It is also a required step before we can switch to Mercurial.
*) Misc: removed unused "snapshot" target.
*) Misc: support for Mercurial repositories.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 29 Mar 2013 18:09:06 +0000 |
parents | 2f0862333985 |
children |
rev | line source |
---|---|
485 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
485 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_http.h> | |
11 | |
12 | |
13 typedef struct { | |
3645
9f22c780d574
eliminate a number of ranges: about 18,000 /16 networks are empty,
Igor Sysoev <igor@sysoev.ru>
parents:
3643
diff
changeset
|
14 ngx_http_variable_value_t *value; |
2399 | 15 u_short start; |
16 u_short end; | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
17 } ngx_http_geo_range_t; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
18 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
19 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
20 typedef struct { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
21 ngx_radix_tree_t *tree; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
22 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
23 ngx_radix_tree_t *tree6; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
24 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
25 } ngx_http_geo_trees_t; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
26 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
27 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
28 typedef struct { |
3652 | 29 ngx_http_geo_range_t **low; |
2399 | 30 ngx_http_variable_value_t *default_value; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
31 } ngx_http_geo_high_ranges_t; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
32 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
33 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
34 typedef struct { |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
35 ngx_str_node_t sn; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
36 ngx_http_variable_value_t *value; |
3652 | 37 size_t offset; |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
38 } ngx_http_geo_variable_value_node_t; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
39 |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
40 |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
41 typedef struct { |
2399 | 42 ngx_http_variable_value_t *value; |
43 ngx_str_t *net; | |
3652 | 44 ngx_http_geo_high_ranges_t high; |
2399 | 45 ngx_radix_tree_t *tree; |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
46 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
47 ngx_radix_tree_t *tree6; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
48 #endif |
2399 | 49 ngx_rbtree_t rbtree; |
50 ngx_rbtree_node_t sentinel; | |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
51 ngx_array_t *proxies; |
2399 | 52 ngx_pool_t *pool; |
53 ngx_pool_t *temp_pool; | |
3652 | 54 |
55 size_t data_size; | |
56 | |
57 ngx_str_t include_name; | |
58 ngx_uint_t includes; | |
59 ngx_uint_t entries; | |
60 | |
61 unsigned ranges:1; | |
62 unsigned outside_entries:1; | |
63 unsigned allow_binary_include:1; | |
64 unsigned binary_include:1; | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
65 unsigned proxy_recursive:1; |
589 | 66 } ngx_http_geo_conf_ctx_t; |
485 | 67 |
68 | |
2399 | 69 typedef struct { |
70 union { | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
71 ngx_http_geo_trees_t trees; |
3652 | 72 ngx_http_geo_high_ranges_t high; |
2399 | 73 } u; |
74 | |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
75 ngx_array_t *proxies; |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
76 unsigned proxy_recursive:1; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
77 |
2399 | 78 ngx_int_t index; |
79 } ngx_http_geo_ctx_t; | |
80 | |
81 | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
82 static ngx_int_t ngx_http_geo_addr(ngx_http_request_t *r, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
83 ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr); |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
84 static ngx_int_t ngx_http_geo_real_addr(ngx_http_request_t *r, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
85 ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr); |
485 | 86 static char *ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); |
87 static char *ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf); | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
88 static char *ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
89 ngx_str_t *value); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
90 static char *ngx_http_geo_add_range(ngx_conf_t *cf, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
91 ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
92 static ngx_uint_t ngx_http_geo_delete_range(ngx_conf_t *cf, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
93 ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
94 static char *ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
95 ngx_str_t *value); |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
96 static char *ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
97 ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
98 static ngx_http_variable_value_t *ngx_http_geo_value(ngx_conf_t *cf, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
99 ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *value); |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
100 static char *ngx_http_geo_add_proxy(ngx_conf_t *cf, |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
101 ngx_http_geo_conf_ctx_t *ctx, ngx_cidr_t *cidr); |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
102 static ngx_int_t ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
103 ngx_cidr_t *cidr); |
3652 | 104 static char *ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
105 ngx_str_t *name); | |
106 static ngx_int_t ngx_http_geo_include_binary_base(ngx_conf_t *cf, | |
107 ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *name); | |
108 static void ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx); | |
109 static u_char *ngx_http_geo_copy_values(u_char *base, u_char *p, | |
110 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); | |
485 | 111 |
112 | |
113 static ngx_command_t ngx_http_geo_commands[] = { | |
114 | |
115 { ngx_string("geo"), | |
2399 | 116 NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12, |
485 | 117 ngx_http_geo_block, |
118 NGX_HTTP_MAIN_CONF_OFFSET, | |
119 0, | |
120 NULL }, | |
121 | |
122 ngx_null_command | |
123 }; | |
124 | |
125 | |
126 static ngx_http_module_t ngx_http_geo_module_ctx = { | |
509 | 127 NULL, /* preconfiguration */ |
128 NULL, /* postconfiguration */ | |
485 | 129 |
130 NULL, /* create main configuration */ | |
131 NULL, /* init main configuration */ | |
132 | |
133 NULL, /* create server configuration */ | |
134 NULL, /* merge server configuration */ | |
135 | |
136 NULL, /* create location configuration */ | |
137 NULL /* merge location configuration */ | |
138 }; | |
139 | |
140 | |
141 ngx_module_t ngx_http_geo_module = { | |
509 | 142 NGX_MODULE_V1, |
485 | 143 &ngx_http_geo_module_ctx, /* module context */ |
144 ngx_http_geo_commands, /* module directives */ | |
145 NGX_HTTP_MODULE, /* module type */ | |
541 | 146 NULL, /* init master */ |
485 | 147 NULL, /* init module */ |
541 | 148 NULL, /* init process */ |
149 NULL, /* init thread */ | |
150 NULL, /* exit thread */ | |
151 NULL, /* exit process */ | |
152 NULL, /* exit master */ | |
153 NGX_MODULE_V1_PADDING | |
485 | 154 }; |
155 | |
156 | |
3652 | 157 typedef struct { |
158 u_char GEORNG[6]; | |
159 u_char version; | |
160 u_char ptr_size; | |
4725
47936d1c98e9
Merge of r4682, r4694, r4699, r4704, r4705: minor nits.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
161 uint32_t endianness; |
3652 | 162 uint32_t crc32; |
163 } ngx_http_geo_header_t; | |
164 | |
165 | |
166 static ngx_http_geo_header_t ngx_http_geo_header = { | |
167 { 'G', 'E', 'O', 'R', 'N', 'G' }, 0, sizeof(void *), 0x12345678, 0 | |
168 }; | |
169 | |
170 | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
171 /* geo range is AF_INET only */ |
485 | 172 |
573 | 173 static ngx_int_t |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
174 ngx_http_geo_cidr_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, |
573 | 175 uintptr_t data) |
485 | 176 { |
2399 | 177 ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data; |
485 | 178 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
179 in_addr_t inaddr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
180 ngx_addr_t addr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
181 struct sockaddr_in *sin; |
573 | 182 ngx_http_variable_value_t *vv; |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
183 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
184 u_char *p; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
185 struct in6_addr *inaddr6; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
186 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
187 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
188 if (ngx_http_geo_addr(r, ctx, &addr) != NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
189 vv = (ngx_http_variable_value_t *) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
190 ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
191 goto done; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
192 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
193 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
194 switch (addr.sockaddr->sa_family) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
195 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
196 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
197 case AF_INET6: |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
198 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
199 p = inaddr6->s6_addr; |
485 | 200 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
201 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
202 inaddr = p[12] << 24; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
203 inaddr += p[13] << 16; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
204 inaddr += p[14] << 8; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
205 inaddr += p[15]; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
206 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
207 vv = (ngx_http_variable_value_t *) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
208 ngx_radix32tree_find(ctx->u.trees.tree, inaddr); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
209 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
210 } else { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
211 vv = (ngx_http_variable_value_t *) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
212 ngx_radix128tree_find(ctx->u.trees.tree6, p); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
213 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
214 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
215 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
216 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
217 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
218 default: /* AF_INET */ |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
219 sin = (struct sockaddr_in *) addr.sockaddr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
220 inaddr = ntohl(sin->sin_addr.s_addr); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
221 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
222 vv = (ngx_http_variable_value_t *) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
223 ngx_radix32tree_find(ctx->u.trees.tree, inaddr); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
224 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
225 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
226 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
227 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
228 done: |
489 | 229 |
573 | 230 *v = *vv; |
231 | |
2399 | 232 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
233 "http geo: %v", v); | |
489 | 234 |
573 | 235 return NGX_OK; |
485 | 236 } |
237 | |
238 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
239 static ngx_int_t |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
240 ngx_http_geo_range_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
241 uintptr_t data) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
242 { |
2399 | 243 ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
244 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
245 in_addr_t inaddr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
246 ngx_addr_t addr; |
3645
9f22c780d574
eliminate a number of ranges: about 18,000 /16 networks are empty,
Igor Sysoev <igor@sysoev.ru>
parents:
3643
diff
changeset
|
247 ngx_uint_t n; |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
248 struct sockaddr_in *sin; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
249 ngx_http_geo_range_t *range; |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
250 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
251 u_char *p; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
252 struct in6_addr *inaddr6; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
253 #endif |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
254 |
3652 | 255 *v = *ctx->u.high.default_value; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
256 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
257 if (ngx_http_geo_addr(r, ctx, &addr) == NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
258 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
259 switch (addr.sockaddr->sa_family) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
260 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
261 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
262 case AF_INET6: |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
263 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
264 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
265 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
266 p = inaddr6->s6_addr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
267 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
268 inaddr = p[12] << 24; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
269 inaddr += p[13] << 16; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
270 inaddr += p[14] << 8; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
271 inaddr += p[15]; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
272 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
273 } else { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
274 inaddr = INADDR_NONE; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
275 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
276 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
277 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
278 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
279 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
280 default: /* AF_INET */ |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
281 sin = (struct sockaddr_in *) addr.sockaddr; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
282 inaddr = ntohl(sin->sin_addr.s_addr); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
283 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
284 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
285 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
286 } else { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
287 inaddr = INADDR_NONE; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
288 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
289 |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
290 if (ctx->u.high.low) { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
291 range = ctx->u.high.low[inaddr >> 16]; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
292 |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
293 if (range) { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
294 n = inaddr & 0xffff; |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
295 do { |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
296 if (n >= (ngx_uint_t) range->start |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
297 && n <= (ngx_uint_t) range->end) |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
298 { |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
299 *v = *range->value; |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
300 break; |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
301 } |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
302 } while ((++range)->value); |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
303 } |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
304 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
305 |
2399 | 306 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
307 "http geo: %v", v); | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
308 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
309 return NGX_OK; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
310 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
311 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
312 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
313 static ngx_int_t |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
314 ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
315 ngx_addr_t *addr) |
2399 | 316 { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
317 ngx_table_elt_t *xfwd; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
318 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
319 if (ngx_http_geo_real_addr(r, ctx, addr) != NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
320 return NGX_ERROR; |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
321 } |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
322 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
323 xfwd = r->headers_in.x_forwarded_for; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
324 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
325 if (xfwd != NULL && ctx->proxies != NULL) { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
326 (void) ngx_http_get_forwarded_addr(r, addr, xfwd->value.data, |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
327 xfwd->value.len, ctx->proxies, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
328 ctx->proxy_recursive); |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
329 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
330 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
331 return NGX_OK; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
332 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
333 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
334 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
335 static ngx_int_t |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
336 ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
337 ngx_addr_t *addr) |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
338 { |
2399 | 339 ngx_http_variable_value_t *v; |
340 | |
341 if (ctx->index == -1) { | |
342 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
343 "http geo started: %V", &r->connection->addr_text); | |
344 | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
345 addr->sockaddr = r->connection->sockaddr; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
346 addr->socklen = r->connection->socklen; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
347 /* addr->name = r->connection->addr_text; */ |
3920
bfe4af74a4f4
support IPv4 mapped to IPv6 in geo module
Igor Sysoev <igor@sysoev.ru>
parents:
3887
diff
changeset
|
348 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
349 return NGX_OK; |
2399 | 350 } |
351 | |
352 v = ngx_http_get_flushed_variable(r, ctx->index); | |
353 | |
354 if (v == NULL || v->not_found) { | |
355 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
356 "http geo not found"); | |
357 | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
358 return NGX_ERROR; |
2399 | 359 } |
360 | |
361 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
362 "http geo started: %v", v); | |
363 | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
364 if (ngx_parse_addr(r->pool, addr, v->data, v->len) == NGX_OK) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
365 return NGX_OK; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
366 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
367 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
368 return NGX_ERROR; |
2399 | 369 } |
370 | |
371 | |
489 | 372 static char * |
373 ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
485 | 374 { |
589 | 375 char *rv; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
376 size_t len; |
2399 | 377 ngx_str_t *value, name; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
378 ngx_uint_t i; |
589 | 379 ngx_conf_t save; |
380 ngx_pool_t *pool; | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
381 ngx_array_t *a; |
1406
03341711f9a2
use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
382 ngx_http_variable_t *var; |
2399 | 383 ngx_http_geo_ctx_t *geo; |
589 | 384 ngx_http_geo_conf_ctx_t ctx; |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
385 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
386 static struct in6_addr zero; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
387 #endif |
485 | 388 |
501 | 389 value = cf->args->elts; |
390 | |
2399 | 391 geo = ngx_palloc(cf->pool, sizeof(ngx_http_geo_ctx_t)); |
392 if (geo == NULL) { | |
393 return NGX_CONF_ERROR; | |
394 } | |
395 | |
396 name = value[1]; | |
5040
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
397 |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
398 if (name.data[0] != '$') { |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
399 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
400 "invalid variable name \"%V\"", &name); |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
401 return NGX_CONF_ERROR; |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
402 } |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
403 |
2399 | 404 name.len--; |
405 name.data++; | |
406 | |
407 if (cf->args->nelts == 3) { | |
408 | |
409 geo->index = ngx_http_get_variable_index(cf, &name); | |
410 if (geo->index == NGX_ERROR) { | |
411 return NGX_CONF_ERROR; | |
412 } | |
413 | |
414 name = value[2]; | |
5040
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
415 |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
416 if (name.data[0] != '$') { |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
417 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
418 "invalid variable name \"%V\"", &name); |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
419 return NGX_CONF_ERROR; |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
420 } |
05beaa2d87b3
Merge of r4948, r4949, r4964, r4973, r5011: variables.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
421 |
2399 | 422 name.len--; |
423 name.data++; | |
424 | |
425 } else { | |
426 geo->index = -1; | |
427 } | |
428 | |
429 var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); | |
501 | 430 if (var == NULL) { |
485 | 431 return NGX_CONF_ERROR; |
432 } | |
433 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
434 pool = ngx_create_pool(16384, cf->log); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
435 if (pool == NULL) { |
485 | 436 return NGX_CONF_ERROR; |
437 } | |
438 | |
3652 | 439 ngx_memzero(&ctx, sizeof(ngx_http_geo_conf_ctx_t)); |
440 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
441 ctx.temp_pool = ngx_create_pool(16384, cf->log); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
442 if (ctx.temp_pool == NULL) { |
485 | 443 return NGX_CONF_ERROR; |
444 } | |
445 | |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
446 ngx_rbtree_init(&ctx.rbtree, &ctx.sentinel, ngx_str_rbtree_insert_value); |
485 | 447 |
589 | 448 ctx.pool = cf->pool; |
3652 | 449 ctx.data_size = sizeof(ngx_http_geo_header_t) |
450 + sizeof(ngx_http_variable_value_t) | |
451 + 0x10000 * sizeof(ngx_http_geo_range_t *); | |
452 ctx.allow_binary_include = 1; | |
485 | 453 |
454 save = *cf; | |
455 cf->pool = pool; | |
589 | 456 cf->ctx = &ctx; |
485 | 457 cf->handler = ngx_http_geo; |
458 cf->handler_conf = conf; | |
459 | |
460 rv = ngx_conf_parse(cf, NULL); | |
461 | |
462 *cf = save; | |
463 | |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
464 geo->proxies = ctx.proxies; |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
465 geo->proxy_recursive = ctx.proxy_recursive; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
466 |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
467 if (ctx.ranges) { |
3652 | 468 |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
469 if (ctx.high.low && !ctx.binary_include) { |
3652 | 470 for (i = 0; i < 0x10000; i++) { |
471 a = (ngx_array_t *) ctx.high.low[i]; | |
472 | |
473 if (a == NULL || a->nelts == 0) { | |
474 continue; | |
475 } | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
476 |
3652 | 477 len = a->nelts * sizeof(ngx_http_geo_range_t); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
478 |
3652 | 479 ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *)); |
480 if (ctx.high.low[i] == NULL) { | |
481 return NGX_CONF_ERROR; | |
482 } | |
483 | |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
484 ngx_memcpy(ctx.high.low[i], a->elts, len); |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
485 ctx.high.low[i][a->nelts].value = NULL; |
3652 | 486 ctx.data_size += len + sizeof(void *); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
487 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
488 |
3652 | 489 if (ctx.allow_binary_include |
490 && !ctx.outside_entries | |
491 && ctx.entries > 100000 | |
492 && ctx.includes == 1) | |
493 { | |
494 ngx_http_geo_create_binary_base(&ctx); | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
495 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
496 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
497 |
4855
f66d0a6d7fdd
Merge of r4817: geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4725
diff
changeset
|
498 if (ctx.high.default_value == NULL) { |
f66d0a6d7fdd
Merge of r4817: geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4725
diff
changeset
|
499 ctx.high.default_value = &ngx_http_variable_null_value; |
f66d0a6d7fdd
Merge of r4817: geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4725
diff
changeset
|
500 } |
f66d0a6d7fdd
Merge of r4817: geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4725
diff
changeset
|
501 |
2399 | 502 geo->u.high = ctx.high; |
503 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
504 var->get_handler = ngx_http_geo_range_variable; |
2399 | 505 var->data = (uintptr_t) geo; |
485 | 506 |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
507 ngx_destroy_pool(ctx.temp_pool); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
508 ngx_destroy_pool(pool); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
509 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
510 } else { |
2358
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
511 if (ctx.tree == NULL) { |
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
512 ctx.tree = ngx_radix_tree_create(cf->pool, -1); |
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
513 if (ctx.tree == NULL) { |
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
514 return NGX_CONF_ERROR; |
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
515 } |
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
516 } |
ac0cf19eb582
create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents:
2340
diff
changeset
|
517 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
518 geo->u.trees.tree = ctx.tree; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
519 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
520 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
521 if (ctx.tree6 == NULL) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
522 ctx.tree6 = ngx_radix_tree_create(cf->pool, -1); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
523 if (ctx.tree6 == NULL) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
524 return NGX_CONF_ERROR; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
525 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
526 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
527 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
528 geo->u.trees.tree6 = ctx.tree6; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
529 #endif |
2399 | 530 |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
531 var->get_handler = ngx_http_geo_cidr_variable; |
2399 | 532 var->data = (uintptr_t) geo; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
533 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
534 ngx_destroy_pool(ctx.temp_pool); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
535 ngx_destroy_pool(pool); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
536 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
537 if (ngx_radix32tree_insert(ctx.tree, 0, 0, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
538 (uintptr_t) &ngx_http_variable_null_value) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
539 == NGX_ERROR) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
540 { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
541 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
542 } |
5047
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
543 |
852f40088278
Merge of r4968, r4969, r4977, r4980, r4981, r4990: geo fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5040
diff
changeset
|
544 /* NGX_BUSY is okay (default was set explicitly) */ |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
545 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
546 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
547 if (ngx_radix128tree_insert(ctx.tree6, zero.s6_addr, zero.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
548 (uintptr_t) &ngx_http_variable_null_value) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
549 == NGX_ERROR) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
550 { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
551 return NGX_CONF_ERROR; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
552 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
553 #endif |
485 | 554 } |
555 | |
556 return rv; | |
557 } | |
558 | |
559 | |
489 | 560 static char * |
561 ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) | |
485 | 562 { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
563 char *rv; |
3652 | 564 ngx_str_t *value; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
565 ngx_cidr_t cidr; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
566 ngx_http_geo_conf_ctx_t *ctx; |
485 | 567 |
589 | 568 ctx = cf->ctx; |
485 | 569 |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
570 value = cf->args->elts; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
571 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
572 if (cf->args->nelts == 1) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
573 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
574 if (ngx_strcmp(value[0].data, "ranges") == 0) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
575 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
576 if (ctx->tree |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
577 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
578 || ctx->tree6 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
579 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
580 ) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
581 { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
582 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
583 "the \"ranges\" directive must be " |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
584 "the first directive inside \"geo\" block"); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
585 goto failed; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
586 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
587 |
3652 | 588 ctx->ranges = 1; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
589 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
590 rv = NGX_CONF_OK; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
591 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
592 goto done; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
593 } |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
594 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
595 else if (ngx_strcmp(value[0].data, "proxy_recursive") == 0) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
596 ctx->proxy_recursive = 1; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
597 rv = NGX_CONF_OK; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
598 goto done; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
599 } |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
600 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
601 |
485 | 602 if (cf->args->nelts != 2) { |
603 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
604 "invalid number of the geo parameters"); | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
605 goto failed; |
485 | 606 } |
607 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
608 if (ngx_strcmp(value[0].data, "include") == 0) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
609 |
3652 | 610 rv = ngx_http_geo_include(cf, ctx, &value[1]); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
611 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
612 goto done; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
613 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
614 } else if (ngx_strcmp(value[0].data, "proxy") == 0) { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
615 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
616 if (ngx_http_geo_cidr_value(cf, &value[1], &cidr) != NGX_OK) { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
617 goto failed; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
618 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
619 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
620 rv = ngx_http_geo_add_proxy(cf, ctx, &cidr); |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
621 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
622 goto done; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
623 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
624 |
3652 | 625 if (ctx->ranges) { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
626 rv = ngx_http_geo_range(cf, ctx, value); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
627 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
628 } else { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
629 rv = ngx_http_geo_cidr(cf, ctx, value); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
630 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
631 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
632 done: |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
633 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
634 ngx_reset_pool(cf->pool); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
635 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
636 return rv; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
637 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
638 failed: |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
639 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
640 ngx_reset_pool(cf->pool); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
641 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
642 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
643 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
644 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
645 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
646 static char * |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
647 ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
648 ngx_str_t *value) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
649 { |
3650
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
650 u_char *p, *last; |
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
651 in_addr_t start, end; |
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
652 ngx_str_t *net; |
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
653 ngx_uint_t del; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
654 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
655 if (ngx_strcmp(value[0].data, "default") == 0) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
656 |
3652 | 657 if (ctx->high.default_value) { |
3650
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
658 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
659 "duplicate default geo range value: \"%V\", old value: \"%v\"", |
3652 | 660 &value[1], ctx->high.default_value); |
3650
c12b0dd5bd1c
change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents:
3645
diff
changeset
|
661 } |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
662 |
3652 | 663 ctx->high.default_value = ngx_http_geo_value(cf, ctx, &value[1]); |
664 if (ctx->high.default_value == NULL) { | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
665 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
666 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
667 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
668 return NGX_CONF_OK; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
669 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
670 |
3652 | 671 if (ctx->binary_include) { |
672 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
673 "binary geo range base \"%s\" cannot be mixed with usual entries", |
3652 | 674 ctx->include_name.data); |
675 return NGX_CONF_ERROR; | |
676 } | |
677 | |
678 if (ctx->high.low == NULL) { | |
679 ctx->high.low = ngx_pcalloc(ctx->pool, | |
680 0x10000 * sizeof(ngx_http_geo_range_t *)); | |
681 if (ctx->high.low == NULL) { | |
682 return NGX_CONF_ERROR; | |
683 } | |
684 } | |
685 | |
686 ctx->entries++; | |
687 ctx->outside_entries = 1; | |
688 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
689 if (ngx_strcmp(value[0].data, "delete") == 0) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
690 net = &value[1]; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
691 del = 1; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
692 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
693 } else { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
694 net = &value[0]; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
695 del = 0; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
696 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
697 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
698 last = net->data + net->len; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
699 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
700 p = ngx_strlchr(net->data, last, '-'); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
701 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
702 if (p == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
703 goto invalid; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
704 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
705 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
706 start = ngx_inet_addr(net->data, p - net->data); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
707 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
708 if (start == INADDR_NONE) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
709 goto invalid; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
710 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
711 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
712 start = ntohl(start); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
713 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
714 p++; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
715 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
716 end = ngx_inet_addr(p, last - p); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
717 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
718 if (end == INADDR_NONE) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
719 goto invalid; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
720 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
721 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
722 end = ntohl(end); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
723 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
724 if (start > end) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
725 goto invalid; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
726 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
727 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
728 if (del) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
729 if (ngx_http_geo_delete_range(cf, ctx, start, end)) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
730 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
731 "no address range \"%V\" to delete", net); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
732 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
733 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
734 return NGX_CONF_OK; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
735 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
736 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
737 ctx->value = ngx_http_geo_value(cf, ctx, &value[1]); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
738 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
739 if (ctx->value == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
740 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
741 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
742 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
743 ctx->net = net; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
744 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
745 return ngx_http_geo_add_range(cf, ctx, start, end); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
746 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
747 invalid: |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
748 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
749 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid range \"%V\"", net); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
750 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
751 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
752 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
753 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
754 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
755 /* the add procedure is optimized to add a growing up sequence */ |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
756 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
757 static char * |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
758 ngx_http_geo_add_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
759 in_addr_t start, in_addr_t end) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
760 { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
761 in_addr_t n; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
762 ngx_uint_t h, i, s, e; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
763 ngx_array_t *a; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
764 ngx_http_geo_range_t *range; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
765 |
3456
91cff7f97a50
fix a geo range if the range includes two or more /16 networks
Igor Sysoev <igor@sysoev.ru>
parents:
3115
diff
changeset
|
766 for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
767 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
768 h = n >> 16; |
2447
3d868fc44879
fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents:
2442
diff
changeset
|
769 |
3d868fc44879
fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents:
2442
diff
changeset
|
770 if (n == start) { |
3d868fc44879
fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents:
2442
diff
changeset
|
771 s = n & 0xffff; |
3d868fc44879
fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents:
2442
diff
changeset
|
772 } else { |
3d868fc44879
fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents:
2442
diff
changeset
|
773 s = 0; |
3d868fc44879
fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents:
2442
diff
changeset
|
774 } |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
775 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
776 if ((n | 0xffff) > end) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
777 e = end & 0xffff; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
778 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
779 } else { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
780 e = 0xffff; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
781 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
782 |
3652 | 783 a = (ngx_array_t *) ctx->high.low[h]; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
784 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
785 if (a == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
786 a = ngx_array_create(ctx->temp_pool, 64, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
787 sizeof(ngx_http_geo_range_t)); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
788 if (a == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
789 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
790 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
791 |
3652 | 792 ctx->high.low[h] = (ngx_http_geo_range_t *) a; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
793 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
794 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
795 i = a->nelts; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
796 range = a->elts; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
797 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
798 while (i) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
799 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
800 i--; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
801 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
802 if (e < (ngx_uint_t) range[i].start) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
803 continue; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
804 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
805 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
806 if (s > (ngx_uint_t) range[i].end) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
807 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
808 /* add after the range */ |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
809 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
810 range = ngx_array_push(a); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
811 if (range == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
812 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
813 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
814 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
815 range = a->elts; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
816 |
3887
e7798b5e990a
use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents:
3660
diff
changeset
|
817 ngx_memmove(&range[i + 2], &range[i + 1], |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
818 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
819 |
2442 | 820 range[i + 1].start = (u_short) s; |
821 range[i + 1].end = (u_short) e; | |
822 range[i + 1].value = ctx->value; | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
823 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
824 goto next; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
825 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
826 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
827 if (s == (ngx_uint_t) range[i].start |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
828 && e == (ngx_uint_t) range[i].end) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
829 { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
830 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
831 "duplicate range \"%V\", value: \"%v\", old value: \"%v\"", |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
832 ctx->net, ctx->value, range[i].value); |
2442 | 833 |
834 range[i].value = ctx->value; | |
835 | |
836 goto next; | |
837 } | |
838 | |
839 if (s > (ngx_uint_t) range[i].start | |
840 && e < (ngx_uint_t) range[i].end) | |
841 { | |
842 /* split the range and insert the new one */ | |
843 | |
844 range = ngx_array_push(a); | |
845 if (range == NULL) { | |
846 return NGX_CONF_ERROR; | |
847 } | |
848 | |
849 range = ngx_array_push(a); | |
850 if (range == NULL) { | |
851 return NGX_CONF_ERROR; | |
852 } | |
853 | |
854 range = a->elts; | |
855 | |
3887
e7798b5e990a
use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents:
3660
diff
changeset
|
856 ngx_memmove(&range[i + 3], &range[i + 1], |
2442 | 857 (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t)); |
858 | |
859 range[i + 2].start = (u_short) (e + 1); | |
860 range[i + 2].end = range[i].end; | |
861 range[i + 2].value = range[i].value; | |
862 | |
2452
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
863 range[i + 1].start = (u_short) s; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
864 range[i + 1].end = (u_short) e; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
865 range[i + 1].value = ctx->value; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
866 |
2442 | 867 range[i].end = (u_short) (s - 1); |
868 | |
2452
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
869 goto next; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
870 } |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
871 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
872 if (s == (ngx_uint_t) range[i].start |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
873 && e < (ngx_uint_t) range[i].end) |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
874 { |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
875 /* shift the range start and insert the new range */ |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
876 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
877 range = ngx_array_push(a); |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
878 if (range == NULL) { |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
879 return NGX_CONF_ERROR; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
880 } |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
881 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
882 range = a->elts; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
883 |
3887
e7798b5e990a
use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents:
3660
diff
changeset
|
884 ngx_memmove(&range[i + 1], &range[i], |
2457
1aff348d9aa8
fix segfault when geo range replaces starting part of another range
Igor Sysoev <igor@sysoev.ru>
parents:
2452
diff
changeset
|
885 (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t)); |
2452
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
886 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
887 range[i + 1].start = (u_short) (e + 1); |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
888 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
889 range[i].start = (u_short) s; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
890 range[i].end = (u_short) e; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
891 range[i].value = ctx->value; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
892 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
893 goto next; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
894 } |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
895 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
896 if (s > (ngx_uint_t) range[i].start |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
897 && e == (ngx_uint_t) range[i].end) |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
898 { |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
899 /* shift the range end and insert the new range */ |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
900 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
901 range = ngx_array_push(a); |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
902 if (range == NULL) { |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
903 return NGX_CONF_ERROR; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
904 } |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
905 |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
906 range = a->elts; |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
907 |
3887
e7798b5e990a
use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents:
3660
diff
changeset
|
908 ngx_memmove(&range[i + 2], &range[i + 1], |
2452
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
909 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
910 |
2442 | 911 range[i + 1].start = (u_short) s; |
912 range[i + 1].end = (u_short) e; | |
913 range[i + 1].value = ctx->value; | |
914 | |
2452
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
915 range[i].end = (u_short) (s - 1); |
95f078e7d743
allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents:
2451
diff
changeset
|
916 |
2442 | 917 goto next; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
918 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
919 |
2448 | 920 s = (ngx_uint_t) range[i].start; |
921 e = (ngx_uint_t) range[i].end; | |
922 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
923 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
2448 | 924 "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"", |
925 ctx->net, | |
926 h >> 8, h & 0xff, s >> 8, s & 0xff, | |
927 h >> 8, h & 0xff, e >> 8, e & 0xff); | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
928 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
929 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
930 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
931 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
932 /* add the first range */ |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
933 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
934 range = ngx_array_push(a); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
935 if (range == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
936 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
937 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
938 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
939 range->start = (u_short) s; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
940 range->end = (u_short) e; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
941 range->value = ctx->value; |
2442 | 942 |
943 next: | |
944 | |
945 continue; | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
946 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
947 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
948 return NGX_CONF_OK; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
949 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
950 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
951 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
952 static ngx_uint_t |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
953 ngx_http_geo_delete_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
954 in_addr_t start, in_addr_t end) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
955 { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
956 in_addr_t n; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
957 ngx_uint_t h, i, s, e, warn; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
958 ngx_array_t *a; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
959 ngx_http_geo_range_t *range; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
960 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
961 warn = 0; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
962 |
2451 | 963 for (n = start; n <= end; n += 0x10000) { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
964 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
965 h = n >> 16; |
2449
450a277dad48
repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents:
2448
diff
changeset
|
966 |
450a277dad48
repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents:
2448
diff
changeset
|
967 if (n == start) { |
450a277dad48
repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents:
2448
diff
changeset
|
968 s = n & 0xffff; |
450a277dad48
repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents:
2448
diff
changeset
|
969 } else { |
450a277dad48
repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents:
2448
diff
changeset
|
970 s = 0; |
450a277dad48
repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents:
2448
diff
changeset
|
971 } |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
972 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
973 if ((n | 0xffff) > end) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
974 e = end & 0xffff; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
975 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
976 } else { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
977 e = 0xffff; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
978 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
979 |
3652 | 980 a = (ngx_array_t *) ctx->high.low[h]; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
981 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
982 if (a == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
983 warn = 1; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
984 continue; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
985 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
986 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
987 range = a->elts; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
988 for (i = 0; i < a->nelts; i++) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
989 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
990 if (s == (ngx_uint_t) range[i].start |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
991 && e == (ngx_uint_t) range[i].end) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
992 { |
3887
e7798b5e990a
use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents:
3660
diff
changeset
|
993 ngx_memmove(&range[i], &range[i + 1], |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
994 (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t)); |
2450 | 995 |
996 a->nelts--; | |
997 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
998 break; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
999 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1000 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1001 if (s != (ngx_uint_t) range[i].start |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1002 && e != (ngx_uint_t) range[i].end) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1003 { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1004 continue; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1005 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1006 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1007 warn = 1; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1008 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1009 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1010 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1011 return warn; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1012 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1013 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1014 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1015 static char * |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1016 ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1017 ngx_str_t *value) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1018 { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1019 char *rv; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1020 ngx_int_t rc, del; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1021 ngx_str_t *net; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1022 ngx_cidr_t cidr; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1023 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1024 if (ctx->tree == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1025 ctx->tree = ngx_radix_tree_create(ctx->pool, -1); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1026 if (ctx->tree == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1027 return NGX_CONF_ERROR; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1028 } |
485 | 1029 } |
1030 | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1031 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1032 if (ctx->tree6 == NULL) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1033 ctx->tree6 = ngx_radix_tree_create(ctx->pool, -1); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1034 if (ctx->tree6 == NULL) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1035 return NGX_CONF_ERROR; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1036 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1037 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1038 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1039 |
485 | 1040 if (ngx_strcmp(value[0].data, "default") == 0) { |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1041 cidr.family = AF_INET; |
2537
a472d954c534
prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents:
2512
diff
changeset
|
1042 cidr.u.in.addr = 0; |
a472d954c534
prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents:
2512
diff
changeset
|
1043 cidr.u.in.mask = 0; |
485 | 1044 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1045 rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1046 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1047 if (rv != NGX_CONF_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1048 return rv; |
1380
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1352
diff
changeset
|
1049 } |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1352
diff
changeset
|
1050 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1051 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1052 cidr.family = AF_INET6; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1053 ngx_memzero(&cidr.u.in6, sizeof(ngx_in6_cidr_t)); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1054 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1055 rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1056 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1057 if (rv != NGX_CONF_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1058 return rv; |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1059 } |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1060 #endif |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1061 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1062 return NGX_CONF_OK; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1063 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1064 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1065 if (ngx_strcmp(value[0].data, "delete") == 0) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1066 net = &value[1]; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1067 del = 1; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1068 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1069 } else { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1070 net = &value[0]; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1071 del = 0; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1072 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1073 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1074 if (ngx_http_geo_cidr_value(cf, net, &cidr) != NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1075 return NGX_CONF_ERROR; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1076 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1077 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1078 if (cidr.family == AF_INET) { |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1079 cidr.u.in.addr = ntohl(cidr.u.in.addr); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1080 cidr.u.in.mask = ntohl(cidr.u.in.mask); |
485 | 1081 } |
1082 | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1083 if (del) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1084 switch (cidr.family) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1085 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1086 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1087 case AF_INET6: |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1088 rc = ngx_radix128tree_delete(ctx->tree6, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1089 cidr.u.in6.addr.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1090 cidr.u.in6.mask.s6_addr); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1091 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1092 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1093 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1094 default: /* AF_INET */ |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1095 rc = ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1096 cidr.u.in.mask); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1097 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1098 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1099 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1100 if (rc != NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1101 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1102 "no network \"%V\" to delete", net); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1103 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1104 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1105 return NGX_CONF_OK; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1106 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1107 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1108 return ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], net); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1109 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1110 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1111 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1112 static char * |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1113 ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1114 ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1115 { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1116 ngx_int_t rc; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1117 ngx_http_variable_value_t *val, *old; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1118 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1119 val = ngx_http_geo_value(cf, ctx, value); |
485 | 1120 |
2334
6e30d64f919b
use value rbtree instead of array in geo configuration
Igor Sysoev <igor@sysoev.ru>
parents:
1565
diff
changeset
|
1121 if (val == NULL) { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1122 return NGX_CONF_ERROR; |
485 | 1123 } |
1124 | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1125 switch (cidr->family) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1126 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1127 #if (NGX_HAVE_INET6) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1128 case AF_INET6: |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1129 rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1130 cidr->u.in6.mask.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1131 (uintptr_t) val); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1132 |
553 | 1133 if (rc == NGX_OK) { |
1134 return NGX_CONF_OK; | |
1135 } | |
1136 | |
1137 if (rc == NGX_ERROR) { | |
1138 return NGX_CONF_ERROR; | |
1139 } | |
1140 | |
1141 /* rc == NGX_BUSY */ | |
1142 | |
3115 | 1143 old = (ngx_http_variable_value_t *) |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1144 ngx_radix128tree_find(ctx->tree6, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1145 cidr->u.in6.addr.s6_addr); |
553 | 1146 |
1147 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1148 "duplicate network \"%V\", value: \"%v\", old value: \"%v\"", |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1149 net, val, old); |
553 | 1150 |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1151 rc = ngx_radix128tree_delete(ctx->tree6, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1152 cidr->u.in6.addr.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1153 cidr->u.in6.mask.s6_addr); |
553 | 1154 |
1155 if (rc == NGX_ERROR) { | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1156 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree"); |
553 | 1157 return NGX_CONF_ERROR; |
1158 } | |
5048
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1159 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1160 rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1161 cidr->u.in6.mask.s6_addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1162 (uintptr_t) val); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1163 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1164 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1165 #endif |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1166 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1167 default: /* AF_INET */ |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1168 rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1169 cidr->u.in.mask, (uintptr_t) val); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1170 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1171 if (rc == NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1172 return NGX_CONF_OK; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1173 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1174 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1175 if (rc == NGX_ERROR) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1176 return NGX_CONF_ERROR; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1177 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1178 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1179 /* rc == NGX_BUSY */ |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1180 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1181 old = (ngx_http_variable_value_t *) |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1182 ngx_radix32tree_find(ctx->tree, cidr->u.in.addr); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1183 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1184 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1185 "duplicate network \"%V\", value: \"%v\", old value: \"%v\"", |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1186 net, val, old); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1187 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1188 rc = ngx_radix32tree_delete(ctx->tree, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1189 cidr->u.in.addr, cidr->u.in.mask); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1190 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1191 if (rc == NGX_ERROR) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1192 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree"); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1193 return NGX_CONF_ERROR; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1194 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1195 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1196 rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr, |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1197 cidr->u.in.mask, (uintptr_t) val); |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1198 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1199 break; |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1200 } |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1201 |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1202 if (rc == NGX_OK) { |
2f0862333985
Merge of r4993, r4994, r4997, r5000: geo ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5047
diff
changeset
|
1203 return NGX_CONF_OK; |
485 | 1204 } |
1205 | |
553 | 1206 return NGX_CONF_ERROR; |
485 | 1207 } |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1208 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1209 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1210 static ngx_http_variable_value_t * |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1211 ngx_http_geo_value(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1212 ngx_str_t *value) |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1213 { |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1214 uint32_t hash; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1215 ngx_http_variable_value_t *val; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1216 ngx_http_geo_variable_value_node_t *gvvn; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1217 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1218 hash = ngx_crc32_long(value->data, value->len); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1219 |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1220 gvvn = (ngx_http_geo_variable_value_node_t *) |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1221 ngx_str_rbtree_lookup(&ctx->rbtree, value, hash); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1222 |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1223 if (gvvn) { |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1224 return gvvn->value; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1225 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1226 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1227 val = ngx_palloc(ctx->pool, sizeof(ngx_http_variable_value_t)); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1228 if (val == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1229 return NULL; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1230 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1231 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1232 val->len = value->len; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1233 val->data = ngx_pstrdup(ctx->pool, value); |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1234 if (val->data == NULL) { |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1235 return NULL; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1236 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1237 |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1238 val->valid = 1; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1239 val->no_cacheable = 0; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1240 val->not_found = 0; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1241 |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1242 gvvn = ngx_palloc(ctx->temp_pool, |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1243 sizeof(ngx_http_geo_variable_value_node_t)); |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1244 if (gvvn == NULL) { |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1245 return NULL; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1246 } |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1247 |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1248 gvvn->sn.node.key = hash; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1249 gvvn->sn.str.len = val->len; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1250 gvvn->sn.str.data = val->data; |
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1251 gvvn->value = val; |
3652 | 1252 gvvn->offset = 0; |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1253 |
3641
6802ba529ec4
change ngx_http_variable_value_node_t to more generic ngx_str_node_t
Igor Sysoev <igor@sysoev.ru>
parents:
3456
diff
changeset
|
1254 ngx_rbtree_insert(&ctx->rbtree, &gvvn->sn.node); |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1255 |
3652 | 1256 ctx->data_size += ngx_align(sizeof(ngx_http_variable_value_t) + value->len, |
1257 sizeof(void *)); | |
1258 | |
2340
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1259 return val; |
22d2b6609853
*) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents:
2334
diff
changeset
|
1260 } |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1261 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1262 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1263 static char * |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1264 ngx_http_geo_add_proxy(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1265 ngx_cidr_t *cidr) |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1266 { |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1267 ngx_cidr_t *c; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1268 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1269 if (ctx->proxies == NULL) { |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1270 ctx->proxies = ngx_array_create(ctx->pool, 4, sizeof(ngx_cidr_t)); |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1271 if (ctx->proxies == NULL) { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1272 return NGX_CONF_ERROR; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1273 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1274 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1275 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1276 c = ngx_array_push(ctx->proxies); |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1277 if (c == NULL) { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1278 return NGX_CONF_ERROR; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1279 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1280 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1281 *c = *cidr; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1282 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1283 return NGX_CONF_OK; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1284 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1285 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1286 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1287 static ngx_int_t |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1288 ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1289 { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1290 ngx_int_t rc; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1291 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1292 if (ngx_strcmp(net->data, "255.255.255.255") == 0) { |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
1293 cidr->family = AF_INET; |
2992
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1294 cidr->u.in.addr = 0xffffffff; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1295 cidr->u.in.mask = 0xffffffff; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1296 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1297 return NGX_OK; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1298 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1299 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1300 rc = ngx_ptocidr(net, cidr); |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1301 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1302 if (rc == NGX_ERROR) { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1303 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net); |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1304 return NGX_ERROR; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1305 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1306 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1307 if (rc == NGX_DONE) { |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1308 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1309 "low address bits of %V are meaningless", net); |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1310 } |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1311 |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1312 return NGX_OK; |
2465ff3da161
geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents:
2537
diff
changeset
|
1313 } |
3652 | 1314 |
1315 | |
1316 static char * | |
1317 ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, | |
1318 ngx_str_t *name) | |
1319 { | |
1320 char *rv; | |
1321 ngx_str_t file; | |
1322 | |
1323 file.len = name->len + 4; | |
1324 file.data = ngx_pnalloc(ctx->temp_pool, name->len + 5); | |
1325 if (file.data == NULL) { | |
1326 return NGX_CONF_ERROR; | |
1327 } | |
1328 | |
1329 ngx_sprintf(file.data, "%V.bin%Z", name); | |
1330 | |
1331 if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) { | |
1332 return NGX_CONF_ERROR; | |
1333 } | |
1334 | |
3654
b56935e34273
test binary geo ranges base only for ranges
Igor Sysoev <igor@sysoev.ru>
parents:
3653
diff
changeset
|
1335 if (ctx->ranges) { |
3660 | 1336 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); |
3652 | 1337 |
3660 | 1338 switch (ngx_http_geo_include_binary_base(cf, ctx, &file)) { |
1339 case NGX_OK: | |
1340 return NGX_CONF_OK; | |
1341 case NGX_ERROR: | |
1342 return NGX_CONF_ERROR; | |
1343 default: | |
1344 break; | |
1345 } | |
3652 | 1346 } |
1347 | |
1348 file.len -= 4; | |
1349 file.data[file.len] = '\0'; | |
1350 | |
1351 ctx->include_name = file; | |
1352 | |
1353 if (ctx->outside_entries) { | |
1354 ctx->allow_binary_include = 0; | |
1355 } | |
1356 | |
1357 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); | |
1358 | |
1359 rv = ngx_conf_parse(cf, &file); | |
1360 | |
1361 ctx->includes++; | |
1362 ctx->outside_entries = 0; | |
1363 | |
1364 return rv; | |
1365 } | |
1366 | |
1367 | |
1368 static ngx_int_t | |
1369 ngx_http_geo_include_binary_base(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, | |
1370 ngx_str_t *name) | |
1371 { | |
3653
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1372 u_char *base, ch; |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1373 time_t mtime; |
3652 | 1374 size_t size, len; |
1375 ssize_t n; | |
1376 uint32_t crc32; | |
1377 ngx_err_t err; | |
1378 ngx_int_t rc; | |
1379 ngx_uint_t i; | |
1380 ngx_file_t file; | |
1381 ngx_file_info_t fi; | |
1382 ngx_http_geo_range_t *range, **ranges; | |
1383 ngx_http_geo_header_t *header; | |
1384 ngx_http_variable_value_t *vv; | |
1385 | |
1386 ngx_memzero(&file, sizeof(ngx_file_t)); | |
1387 file.name = *name; | |
1388 file.log = cf->log; | |
1389 | |
1390 file.fd = ngx_open_file(name->data, NGX_FILE_RDONLY, 0, 0); | |
1391 if (file.fd == NGX_INVALID_FILE) { | |
1392 err = ngx_errno; | |
1393 if (err != NGX_ENOENT) { | |
1394 ngx_conf_log_error(NGX_LOG_CRIT, cf, err, | |
1395 ngx_open_file_n " \"%s\" failed", name->data); | |
1396 } | |
1397 return NGX_DECLINED; | |
1398 } | |
1399 | |
1400 if (ctx->outside_entries) { | |
1401 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
1402 "binary geo range base \"%s\" cannot be mixed with usual entries", |
3652 | 1403 name->data); |
1404 rc = NGX_ERROR; | |
1405 goto done; | |
1406 } | |
1407 | |
3655
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1408 if (ctx->binary_include) { |
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1409 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
1410 "second binary geo range base \"%s\" cannot be mixed with \"%s\"", |
3655
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1411 name->data, ctx->include_name.data); |
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1412 rc = NGX_ERROR; |
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1413 goto done; |
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1414 } |
ec20f1f93aea
test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents:
3654
diff
changeset
|
1415 |
3652 | 1416 if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) { |
1417 ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, | |
1418 ngx_fd_info_n " \"%s\" failed", name->data); | |
1419 goto failed; | |
1420 } | |
1421 | |
1422 size = (size_t) ngx_file_size(&fi); | |
3653
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1423 mtime = ngx_file_mtime(&fi); |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1424 |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1425 ch = name->data[name->len - 4]; |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1426 name->data[name->len - 4] = '\0'; |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1427 |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1428 if (ngx_file_info(name->data, &fi) == NGX_FILE_ERROR) { |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1429 ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1430 ngx_file_info_n " \"%s\" failed", name->data); |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1431 goto failed; |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1432 } |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1433 |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1434 name->data[name->len - 4] = ch; |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1435 |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1436 if (mtime < ngx_file_mtime(&fi)) { |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1437 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1438 "stale binary geo range base \"%s\"", name->data); |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1439 goto failed; |
be3f716ba546
test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents:
3652
diff
changeset
|
1440 } |
3652 | 1441 |
1442 base = ngx_palloc(ctx->pool, size); | |
1443 if (base == NULL) { | |
1444 goto failed; | |
1445 } | |
1446 | |
1447 n = ngx_read_file(&file, base, size, 0); | |
1448 | |
1449 if (n == NGX_ERROR) { | |
1450 ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, | |
1451 ngx_read_file_n " \"%s\" failed", name->data); | |
1452 goto failed; | |
1453 } | |
1454 | |
1455 if ((size_t) n != size) { | |
1456 ngx_conf_log_error(NGX_LOG_CRIT, cf, 0, | |
1457 ngx_read_file_n " \"%s\" returned only %z bytes instead of %z", | |
1458 name->data, n, size); | |
1459 goto failed; | |
1460 } | |
1461 | |
1462 header = (ngx_http_geo_header_t *) base; | |
1463 | |
3656
3d61601f3171
test binary geo range base size
Igor Sysoev <igor@sysoev.ru>
parents:
3655
diff
changeset
|
1464 if (size < 16 || ngx_memcmp(&ngx_http_geo_header, header, 12) != 0) { |
3652 | 1465 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
1466 "incompatible binary geo range base \"%s\"", name->data); | |
1467 goto failed; | |
1468 } | |
1469 | |
1470 ngx_crc32_init(crc32); | |
1471 | |
1472 vv = (ngx_http_variable_value_t *) (base + sizeof(ngx_http_geo_header_t)); | |
1473 | |
1474 while(vv->data) { | |
1475 len = ngx_align(sizeof(ngx_http_variable_value_t) + vv->len, | |
1476 sizeof(void *)); | |
1477 ngx_crc32_update(&crc32, (u_char *) vv, len); | |
1478 vv->data += (size_t) base; | |
1479 vv = (ngx_http_variable_value_t *) ((u_char *) vv + len); | |
1480 } | |
1481 ngx_crc32_update(&crc32, (u_char *) vv, sizeof(ngx_http_variable_value_t)); | |
1482 vv++; | |
1483 | |
1484 ranges = (ngx_http_geo_range_t **) vv; | |
1485 | |
1486 for (i = 0; i < 0x10000; i++) { | |
1487 ngx_crc32_update(&crc32, (u_char *) &ranges[i], sizeof(void *)); | |
1488 if (ranges[i]) { | |
1489 ranges[i] = (ngx_http_geo_range_t *) | |
1490 ((u_char *) ranges[i] + (size_t) base); | |
1491 } | |
1492 } | |
1493 | |
1494 range = (ngx_http_geo_range_t *) &ranges[0x10000]; | |
1495 | |
1496 while ((u_char *) range < base + size) { | |
1497 while (range->value) { | |
1498 ngx_crc32_update(&crc32, (u_char *) range, | |
1499 sizeof(ngx_http_geo_range_t)); | |
1500 range->value = (ngx_http_variable_value_t *) | |
1501 ((u_char *) range->value + (size_t) base); | |
1502 range++; | |
1503 } | |
1504 ngx_crc32_update(&crc32, (u_char *) range, sizeof(void *)); | |
1505 range = (ngx_http_geo_range_t *) ((u_char *) range + sizeof(void *)); | |
1506 } | |
1507 | |
1508 ngx_crc32_final(crc32); | |
1509 | |
1510 if (crc32 != header->crc32) { | |
1511 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | |
1512 "CRC32 mismatch in binary geo range base \"%s\"", name->data); | |
1513 goto failed; | |
1514 } | |
1515 | |
1516 ngx_conf_log_error(NGX_LOG_NOTICE, cf, 0, | |
1517 "using binary geo range base \"%s\"", name->data); | |
1518 | |
1519 ctx->include_name = *name; | |
1520 ctx->binary_include = 1; | |
1521 ctx->high.low = ranges; | |
1522 rc = NGX_OK; | |
1523 | |
1524 goto done; | |
1525 | |
1526 failed: | |
1527 | |
1528 rc = NGX_DECLINED; | |
1529 | |
1530 done: | |
1531 | |
1532 if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { | |
1533 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, | |
1534 ngx_close_file_n " \"%s\" failed", name->data); | |
1535 } | |
1536 | |
1537 return rc; | |
1538 } | |
1539 | |
1540 | |
1541 static void | |
1542 ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx) | |
1543 { | |
1544 u_char *p; | |
1545 uint32_t hash; | |
1546 ngx_str_t s; | |
1547 ngx_uint_t i; | |
1548 ngx_file_mapping_t fm; | |
1549 ngx_http_geo_range_t *r, *range, **ranges; | |
1550 ngx_http_geo_header_t *header; | |
1551 ngx_http_geo_variable_value_node_t *gvvn; | |
1552 | |
1553 fm.name = ngx_pnalloc(ctx->temp_pool, ctx->include_name.len + 5); | |
1554 if (fm.name == NULL) { | |
1555 return; | |
1556 } | |
1557 | |
1558 ngx_sprintf(fm.name, "%V.bin%Z", &ctx->include_name); | |
1559 | |
1560 fm.size = ctx->data_size; | |
1561 fm.log = ctx->pool->log; | |
1562 | |
1563 ngx_log_error(NGX_LOG_NOTICE, fm.log, 0, | |
1564 "creating binary geo range base \"%s\"", fm.name); | |
1565 | |
1566 if (ngx_create_file_mapping(&fm) != NGX_OK) { | |
1567 return; | |
1568 } | |
1569 | |
1570 p = ngx_cpymem(fm.addr, &ngx_http_geo_header, | |
1571 sizeof(ngx_http_geo_header_t)); | |
1572 | |
1573 p = ngx_http_geo_copy_values(fm.addr, p, ctx->rbtree.root, | |
1574 ctx->rbtree.sentinel); | |
1575 | |
1576 p += sizeof(ngx_http_variable_value_t); | |
1577 | |
1578 ranges = (ngx_http_geo_range_t **) p; | |
1579 | |
1580 p += 0x10000 * sizeof(ngx_http_geo_range_t *); | |
1581 | |
1582 for (i = 0; i < 0x10000; i++) { | |
1583 r = ctx->high.low[i]; | |
1584 if (r == NULL) { | |
1585 continue; | |
1586 } | |
1587 | |
1588 range = (ngx_http_geo_range_t *) p; | |
1589 ranges[i] = (ngx_http_geo_range_t *) (p - (u_char *) fm.addr); | |
1590 | |
1591 do { | |
1592 s.len = r->value->len; | |
1593 s.data = r->value->data; | |
1594 hash = ngx_crc32_long(s.data, s.len); | |
1595 gvvn = (ngx_http_geo_variable_value_node_t *) | |
1596 ngx_str_rbtree_lookup(&ctx->rbtree, &s, hash); | |
1597 | |
1598 range->value = (ngx_http_variable_value_t *) gvvn->offset; | |
1599 range->start = r->start; | |
1600 range->end = r->end; | |
1601 range++; | |
1602 | |
1603 } while ((++r)->value); | |
1604 | |
1605 range->value = NULL; | |
1606 | |
1607 p = (u_char *) range + sizeof(void *); | |
1608 } | |
1609 | |
1610 header = fm.addr; | |
1611 header->crc32 = ngx_crc32_long((u_char *) fm.addr | |
1612 + sizeof(ngx_http_geo_header_t), | |
1613 fm.size - sizeof(ngx_http_geo_header_t)); | |
1614 | |
1615 ngx_close_file_mapping(&fm); | |
1616 } | |
1617 | |
1618 | |
1619 static u_char * | |
1620 ngx_http_geo_copy_values(u_char *base, u_char *p, ngx_rbtree_node_t *node, | |
1621 ngx_rbtree_node_t *sentinel) | |
1622 { | |
1623 ngx_http_variable_value_t *vv; | |
1624 ngx_http_geo_variable_value_node_t *gvvn; | |
1625 | |
1626 if (node == sentinel) { | |
1627 return p; | |
1628 } | |
1629 | |
1630 gvvn = (ngx_http_geo_variable_value_node_t *) node; | |
1631 gvvn->offset = p - base; | |
1632 | |
1633 vv = (ngx_http_variable_value_t *) p; | |
1634 *vv = *gvvn->value; | |
1635 p += sizeof(ngx_http_variable_value_t); | |
1636 vv->data = (u_char *) (p - base); | |
1637 | |
1638 p = ngx_cpymem(p, gvvn->sn.str.data, gvvn->sn.str.len); | |
1639 | |
1640 p = ngx_align_ptr(p, sizeof(void *)); | |
1641 | |
1642 p = ngx_http_geo_copy_values(base, p, node->left, sentinel); | |
1643 | |
1644 return ngx_http_geo_copy_values(base, p, node->right, sentinel); | |
1645 } |