annotate src/http/modules/ngx_http_geo_module.c @ 7055:887c8c58ffeb

Range filter: avoid negative range start. Suffix ranges no longer allowed to set negative start values, to prevent ranges with negative start from appearing even if total size protection will be removed.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 11 Jul 2017 16:06:26 +0300
parents 3f82c1e7e29e
children 577628e6b6a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3920
diff changeset
4 * Copyright (C) Nginx, Inc.
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
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
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
15 u_short start;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
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 {
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
21 ngx_radix_tree_t *tree;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
22 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
23 ngx_radix_tree_t *tree6;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
24 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
25 } ngx_http_geo_trees_t;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
26
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
27
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
28 typedef struct {
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
29 ngx_http_geo_range_t **low;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
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
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
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
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
42 ngx_http_variable_value_t *value;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
43 ngx_str_t *net;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
44 ngx_http_geo_high_ranges_t high;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
45 ngx_radix_tree_t *tree;
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
46 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
47 ngx_radix_tree_t *tree6;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
48 #endif
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
49 ngx_rbtree_t rbtree;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
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
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
52 ngx_pool_t *pool;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
53 ngx_pool_t *temp_pool;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
54
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
55 size_t data_size;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
56
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
57 ngx_str_t include_name;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
58 ngx_uint_t includes;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
59 ngx_uint_t entries;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
60
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
61 unsigned ranges:1;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
62 unsigned outside_entries:1;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
63 unsigned allow_binary_include:1;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
64 unsigned binary_include:1;
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
65 unsigned proxy_recursive:1;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
66 } ngx_http_geo_conf_ctx_t;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
69 typedef struct {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
70 union {
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
71 ngx_http_geo_trees_t trees;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
72 ngx_http_geo_high_ranges_t high;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
73 } u;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
74
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
75 ngx_array_t *proxies;
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
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
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
78 ngx_int_t index;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
79 } ngx_http_geo_ctx_t;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
80
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
81
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
82 static ngx_int_t ngx_http_geo_addr(ngx_http_request_t *r,
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
83 ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
84 static ngx_int_t ngx_http_geo_real_addr(ngx_http_request_t *r,
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
85 ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 static char *ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
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);
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
96 static char *ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
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
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
104 static char *ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
105 ngx_str_t *name);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
106 static ngx_int_t ngx_http_geo_include_binary_base(ngx_conf_t *cf,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
107 ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *name);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
108 static void ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
109 static u_char *ngx_http_geo_copy_values(u_char *base, u_char *p,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
110 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 static ngx_command_t ngx_http_geo_commands[] = {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 { ngx_string("geo"),
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
116 NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 ngx_http_geo_block,
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 NGX_HTTP_MAIN_CONF_OFFSET,
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 0,
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 NULL },
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 ngx_null_command
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 };
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 static ngx_http_module_t ngx_http_geo_module_ctx = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
127 NULL, /* preconfiguration */
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
128 NULL, /* postconfiguration */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 NULL, /* create main configuration */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 NULL, /* init main configuration */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 NULL, /* create server configuration */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 NULL, /* merge server configuration */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NULL, /* create location configuration */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL /* merge location configuration */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 };
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 ngx_module_t ngx_http_geo_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
142 NGX_MODULE_V1,
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 &ngx_http_geo_module_ctx, /* module context */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 ngx_http_geo_commands, /* module directives */
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
146 NULL, /* init master */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
148 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
149 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
150 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
151 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
152 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
153 NGX_MODULE_V1_PADDING
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 };
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
157 typedef struct {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
158 u_char GEORNG[6];
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
159 u_char version;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
160 u_char ptr_size;
4681
bb37a9cc08fb Fixed spelling of "endianness", and called it "byte ordering" in the
Ruslan Ermilov <ru@nginx.com>
parents: 4626
diff changeset
161 uint32_t endianness;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
162 uint32_t crc32;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
163 } ngx_http_geo_header_t;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
164
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
165
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
166 static ngx_http_geo_header_t ngx_http_geo_header = {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
167 { 'G', 'E', 'O', 'R', 'N', 'G' }, 0, sizeof(void *), 0x12345678, 0
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
168 };
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
169
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
170
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
171 /* geo range is AF_INET only */
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
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
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
175 uintptr_t data)
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 {
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
177 ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
179 in_addr_t inaddr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
180 ngx_addr_t addr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
181 struct sockaddr_in *sin;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
182 ngx_http_variable_value_t *vv;
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
183 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
184 u_char *p;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
185 struct in6_addr *inaddr6;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
186 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
187
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
188 if (ngx_http_geo_addr(r, ctx, &addr) != NGX_OK) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
189 vv = (ngx_http_variable_value_t *)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
190 ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
191 goto done;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
192 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
193
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
194 switch (addr.sockaddr->sa_family) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
195
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
196 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
197 case AF_INET6:
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
198 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
199 p = inaddr6->s6_addr;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
201 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
202 inaddr = p[12] << 24;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
203 inaddr += p[13] << 16;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
204 inaddr += p[14] << 8;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
205 inaddr += p[15];
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
206
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
207 vv = (ngx_http_variable_value_t *)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
208 ngx_radix32tree_find(ctx->u.trees.tree, inaddr);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
209
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
210 } else {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
211 vv = (ngx_http_variable_value_t *)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
212 ngx_radix128tree_find(ctx->u.trees.tree6, p);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
213 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
214
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
215 break;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
216 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
217
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
218 default: /* AF_INET */
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
219 sin = (struct sockaddr_in *) addr.sockaddr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
220 inaddr = ntohl(sin->sin_addr.s_addr);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
221
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
222 vv = (ngx_http_variable_value_t *)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
223 ngx_radix32tree_find(ctx->u.trees.tree, inaddr);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
224
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
225 break;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
226 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
227
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
228 done:
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
229
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
230 *v = *vv;
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
231
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
232 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
233 "http geo: %v", v);
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
234
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 563
diff changeset
235 return NGX_OK;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
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
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
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
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
245 in_addr_t inaddr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
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;
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
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;
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
250 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
251 u_char *p;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
252 struct in6_addr *inaddr6;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
253 #endif
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
254
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
255 *v = *ctx->u.high.default_value;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
256
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
257 if (ngx_http_geo_addr(r, ctx, &addr) == NGX_OK) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
258
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
259 switch (addr.sockaddr->sa_family) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
260
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
261 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
262 case AF_INET6:
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
263 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
264
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
265 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
266 p = inaddr6->s6_addr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
267
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
268 inaddr = p[12] << 24;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
269 inaddr += p[13] << 16;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
270 inaddr += p[14] << 8;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
271 inaddr += p[15];
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
272
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
273 } else {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
274 inaddr = INADDR_NONE;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
275 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
276
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
277 break;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
278 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
279
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
280 default: /* AF_INET */
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
281 sin = (struct sockaddr_in *) addr.sockaddr;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
282 inaddr = ntohl(sin->sin_addr.s_addr);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
283 break;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
284 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
285
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
286 } else {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
287 inaddr = INADDR_NONE;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
288 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
289
4968
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
290 if (ctx->u.high.low) {
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
291 range = ctx->u.high.low[inaddr >> 16];
4989
eababa1dc446 Trailing whitespace fix.
Ruslan Ermilov <ru@nginx.com>
parents: 4980
diff changeset
292
4968
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
293 if (range) {
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
294 n = inaddr & 0xffff;
4968
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
295 do {
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
296 if (n >= (ngx_uint_t) range->start
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
297 && n <= (ngx_uint_t) range->end)
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
298 {
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
299 *v = *range->value;
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
300 break;
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
301 }
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
302 } while ((++range)->value);
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
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
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
306 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
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
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
313 static ngx_int_t
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
314 ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
315 ngx_addr_t *addr)
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
316 {
5084
f7fe817c92a2 Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents: 4999
diff changeset
317 ngx_array_t *xfwd;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
318
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
319 if (ngx_http_geo_real_addr(r, ctx, addr) != NGX_OK) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
320 return NGX_ERROR;
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
321 }
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
322
5084
f7fe817c92a2 Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents: 4999
diff changeset
323 xfwd = &r->headers_in.x_forwarded_for;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
324
5084
f7fe817c92a2 Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents: 4999
diff changeset
325 if (xfwd->nelts > 0 && ctx->proxies != NULL) {
f7fe817c92a2 Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents: 4999
diff changeset
326 (void) ngx_http_get_forwarded_addr(r, addr, xfwd, NULL,
f7fe817c92a2 Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents: 4999
diff changeset
327 ctx->proxies, ctx->proxy_recursive);
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
328 }
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
329
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
330 return NGX_OK;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
331 }
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
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
334 static ngx_int_t
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
335 ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
336 ngx_addr_t *addr)
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
337 {
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
338 ngx_http_variable_value_t *v;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
339
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
340 if (ctx->index == -1) {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
341 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
342 "http geo started: %V", &r->connection->addr_text);
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
343
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
344 addr->sockaddr = r->connection->sockaddr;
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
345 addr->socklen = r->connection->socklen;
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
346 /* 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
347
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
348 return NGX_OK;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
349 }
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
350
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
351 v = ngx_http_get_flushed_variable(r, ctx->index);
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
352
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
353 if (v == NULL || v->not_found) {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
354 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
355 "http geo not found");
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
356
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
357 return NGX_ERROR;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
358 }
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
359
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
360 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
361 "http geo started: %v", v);
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
362
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
363 if (ngx_parse_addr(r->pool, addr, v->data, v->len) == NGX_OK) {
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
364 return NGX_OK;
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
365 }
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
366
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
367 return NGX_ERROR;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
368 }
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
369
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
370
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
371 static char *
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
372 ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 {
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
374 char *rv;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
375 size_t len;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
376 ngx_str_t *value, name;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
377 ngx_uint_t i;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
378 ngx_conf_t save;
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
379 ngx_pool_t *pool;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
380 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
381 ngx_http_variable_t *var;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
382 ngx_http_geo_ctx_t *geo;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
383 ngx_http_geo_conf_ctx_t ctx;
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
384 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
385 static struct in6_addr zero;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
386 #endif
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
388 value = cf->args->elts;
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
389
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
390 geo = ngx_palloc(cf->pool, sizeof(ngx_http_geo_ctx_t));
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
391 if (geo == NULL) {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
392 return NGX_CONF_ERROR;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
393 }
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
394
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
395 name = value[1];
4963
9f4cdc7a8578 Fixed variable syntax checking in "set", "geo", "limit_conn_zone",
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
396
4972
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
397 if (name.data[0] != '$') {
4963
9f4cdc7a8578 Fixed variable syntax checking in "set", "geo", "limit_conn_zone",
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
398 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
9f4cdc7a8578 Fixed variable syntax checking in "set", "geo", "limit_conn_zone",
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
399 "invalid variable name \"%V\"", &name);
9f4cdc7a8578 Fixed variable syntax checking in "set", "geo", "limit_conn_zone",
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
400 return NGX_CONF_ERROR;
9f4cdc7a8578 Fixed variable syntax checking in "set", "geo", "limit_conn_zone",
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
401 }
9f4cdc7a8578 Fixed variable syntax checking in "set", "geo", "limit_conn_zone",
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
402
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
403 name.len--;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
404 name.data++;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
405
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
406 if (cf->args->nelts == 3) {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
407
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
408 geo->index = ngx_http_get_variable_index(cf, &name);
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
409 if (geo->index == NGX_ERROR) {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
410 return NGX_CONF_ERROR;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
411 }
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
412
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
413 name = value[2];
4972
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
414
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
415 if (name.data[0] != '$') {
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
416 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
417 "invalid variable name \"%V\"", &name);
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
418 return NGX_CONF_ERROR;
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
419 }
8b635cf36ccc Added checks that disallow adding a variable with an empty name.
Ruslan Ermilov <ru@nginx.com>
parents: 4968
diff changeset
420
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
421 name.len--;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
422 name.data++;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
423
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
424 } else {
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
425 geo->index = -1;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
426 }
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
427
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
428 var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 489
diff changeset
429 if (var == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432
5124
5482671df278 Use NGX_DEFAULT_POOL_SIZE macro where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 5084
diff changeset
433 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
434 if (pool == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
438 ngx_memzero(&ctx, sizeof(ngx_http_geo_conf_ctx_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
439
5124
5482671df278 Use NGX_DEFAULT_POOL_SIZE macro where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 5084
diff changeset
440 ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
441 if (ctx.temp_pool == NULL) {
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 return NGX_CONF_ERROR;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444
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
445 ngx_rbtree_init(&ctx.rbtree, &ctx.sentinel, ngx_str_rbtree_insert_value);
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
447 ctx.pool = cf->pool;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
448 ctx.data_size = sizeof(ngx_http_geo_header_t)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
449 + sizeof(ngx_http_variable_value_t)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
450 + 0x10000 * sizeof(ngx_http_geo_range_t *);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
451 ctx.allow_binary_include = 1;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 save = *cf;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454 cf->pool = pool;
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
455 cf->ctx = &ctx;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 cf->handler = ngx_http_geo;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 cf->handler_conf = conf;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 rv = ngx_conf_parse(cf, NULL);
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 *cf = save;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
463 geo->proxies = ctx.proxies;
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
464 geo->proxy_recursive = ctx.proxy_recursive;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
465
4968
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
466 if (ctx.ranges) {
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
467
4968
90d8c3400769 Geo: fixed the "ranges" without ranges case.
Ruslan Ermilov <ru@nginx.com>
parents: 4967
diff changeset
468 if (ctx.high.low && !ctx.binary_include) {
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
469 for (i = 0; i < 0x10000; i++) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
470 a = (ngx_array_t *) ctx.high.low[i];
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
471
6655
873d7053efb9 Geo: fixed access to already freed memory.
Valentin Bartenev <vbart@nginx.com>
parents: 5757
diff changeset
472 if (a == NULL) {
873d7053efb9 Geo: fixed access to already freed memory.
Valentin Bartenev <vbart@nginx.com>
parents: 5757
diff changeset
473 continue;
873d7053efb9 Geo: fixed access to already freed memory.
Valentin Bartenev <vbart@nginx.com>
parents: 5757
diff changeset
474 }
873d7053efb9 Geo: fixed access to already freed memory.
Valentin Bartenev <vbart@nginx.com>
parents: 5757
diff changeset
475
873d7053efb9 Geo: fixed access to already freed memory.
Valentin Bartenev <vbart@nginx.com>
parents: 5757
diff changeset
476 if (a->nelts == 0) {
873d7053efb9 Geo: fixed access to already freed memory.
Valentin Bartenev <vbart@nginx.com>
parents: 5757
diff changeset
477 ctx.high.low[i] = NULL;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
478 continue;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
479 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
480
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
481 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
482
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
483 ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
484 if (ctx.high.low[i] == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
485 return NGX_CONF_ERROR;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
486 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
487
4967
a9d60fafaa85 Geo: improved ngx_http_geo_block() code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4963
diff changeset
488 ngx_memcpy(ctx.high.low[i], a->elts, len);
a9d60fafaa85 Geo: improved ngx_http_geo_block() code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4963
diff changeset
489 ctx.high.low[i][a->nelts].value = NULL;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
490 ctx.data_size += len + sizeof(void *);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
491 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
492
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
493 if (ctx.allow_binary_include
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
494 && !ctx.outside_entries
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
495 && ctx.entries > 100000
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
496 && ctx.includes == 1)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
497 {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
498 ngx_http_geo_create_binary_base(&ctx);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
499 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
500 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
501
4816
2ccaaf838bc2 Geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4681
diff changeset
502 if (ctx.high.default_value == NULL) {
2ccaaf838bc2 Geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4681
diff changeset
503 ctx.high.default_value = &ngx_http_variable_null_value;
2ccaaf838bc2 Geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4681
diff changeset
504 }
2ccaaf838bc2 Geo: fixed handling of ranges without default set.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4681
diff changeset
505
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
506 geo->u.high = ctx.high;
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
507
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
508 var->get_handler = ngx_http_geo_range_variable;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
509 var->data = (uintptr_t) geo;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
511 ngx_destroy_pool(ctx.temp_pool);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
512 ngx_destroy_pool(pool);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
513
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
514 } else {
2358
ac0cf19eb582 create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents: 2340
diff changeset
515 if (ctx.tree == NULL) {
ac0cf19eb582 create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents: 2340
diff changeset
516 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
517 if (ctx.tree == NULL) {
ac0cf19eb582 create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents: 2340
diff changeset
518 return NGX_CONF_ERROR;
ac0cf19eb582 create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents: 2340
diff changeset
519 }
ac0cf19eb582 create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents: 2340
diff changeset
520 }
ac0cf19eb582 create empty radix tree for "geo $geo { }" case
Igor Sysoev <igor@sysoev.ru>
parents: 2340
diff changeset
521
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
522 geo->u.trees.tree = ctx.tree;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
523
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
524 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
525 if (ctx.tree6 == NULL) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
526 ctx.tree6 = ngx_radix_tree_create(cf->pool, -1);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
527 if (ctx.tree6 == NULL) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
528 return NGX_CONF_ERROR;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
529 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
530 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
531
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
532 geo->u.trees.tree6 = ctx.tree6;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
533 #endif
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
534
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
535 var->get_handler = ngx_http_geo_cidr_variable;
2399
aecf0755cee3 $geo variable support
Igor Sysoev <igor@sysoev.ru>
parents: 2398
diff changeset
536 var->data = (uintptr_t) geo;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
537
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
538 ngx_destroy_pool(ctx.temp_pool);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
539 ngx_destroy_pool(pool);
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 if (ngx_radix32tree_insert(ctx.tree, 0, 0,
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
542 (uintptr_t) &ngx_http_variable_null_value)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
543 == NGX_ERROR)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
544 {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
545 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
546 }
4980
f091722acab4 Geo: ensure that default entry is always present.
Ruslan Ermilov <ru@nginx.com>
parents: 4979
diff changeset
547
f091722acab4 Geo: ensure that default entry is always present.
Ruslan Ermilov <ru@nginx.com>
parents: 4979
diff changeset
548 /* NGX_BUSY is okay (default was set explicitly) */
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
549
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
550 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
551 if (ngx_radix128tree_insert(ctx.tree6, zero.s6_addr, zero.s6_addr,
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
552 (uintptr_t) &ngx_http_variable_null_value)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
553 == NGX_ERROR)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
554 {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
555 return NGX_CONF_ERROR;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
556 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
557 #endif
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560 return rv;
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563
489
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
564 static char *
45a460f82aec nginx-0.1.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 487
diff changeset
565 ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
567 char *rv;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
568 ngx_str_t *value;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
569 ngx_cidr_t cidr;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
570 ngx_http_geo_conf_ctx_t *ctx;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571
589
d4e858a5751a nginx-0.3.16-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
572 ctx = cf->ctx;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
574 value = cf->args->elts;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
575
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
576 if (cf->args->nelts == 1) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
577
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
578 if (ngx_strcmp(value[0].data, "ranges") == 0) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
579
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
580 if (ctx->tree
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
581 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
582 || ctx->tree6
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
583 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
584 )
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
585 {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
586 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
587 "the \"ranges\" directive must be "
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
588 "the first directive inside \"geo\" block");
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
589 goto failed;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
590 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
591
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
592 ctx->ranges = 1;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
593
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
594 rv = NGX_CONF_OK;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
595
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
596 goto done;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
597 }
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
598
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
599 else if (ngx_strcmp(value[0].data, "proxy_recursive") == 0) {
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
600 ctx->proxy_recursive = 1;
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
601 rv = NGX_CONF_OK;
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
602 goto done;
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
603 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
604 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
605
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 if (cf->args->nelts != 2) {
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 "invalid number of the geo parameters");
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
609 goto failed;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
612 if (ngx_strcmp(value[0].data, "include") == 0) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
613
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
614 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
615
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
616 goto done;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
617
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
618 } else if (ngx_strcmp(value[0].data, "proxy") == 0) {
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 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
621 goto failed;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
622 }
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
623
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
624 rv = ngx_http_geo_add_proxy(cf, ctx, &cidr);
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
625
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
626 goto done;
2340
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
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
629 if (ctx->ranges) {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
630 rv = ngx_http_geo_range(cf, ctx, value);
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 } else {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
633 rv = ngx_http_geo_cidr(cf, ctx, value);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
634 }
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 done:
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 ngx_reset_pool(cf->pool);
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 return rv;
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 failed:
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 ngx_reset_pool(cf->pool);
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 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
647 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
648
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
649
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
650 static char *
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
651 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
652 ngx_str_t *value)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
653 {
3650
c12b0dd5bd1c change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents: 3645
diff changeset
654 u_char *p, *last;
c12b0dd5bd1c change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents: 3645
diff changeset
655 in_addr_t start, end;
c12b0dd5bd1c change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents: 3645
diff changeset
656 ngx_str_t *net;
c12b0dd5bd1c change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents: 3645
diff changeset
657 ngx_uint_t del;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
658
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
659 if (ngx_strcmp(value[0].data, "default") == 0) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
660
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
661 if (ctx->high.default_value) {
3650
c12b0dd5bd1c change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents: 3645
diff changeset
662 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
663 "duplicate default geo range value: \"%V\", old value: \"%v\"",
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
664 &value[1], ctx->high.default_value);
3650
c12b0dd5bd1c change duplicate default geo range processing
Igor Sysoev <igor@sysoev.ru>
parents: 3645
diff changeset
665 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
666
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
667 ctx->high.default_value = ngx_http_geo_value(cf, ctx, &value[1]);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
668 if (ctx->high.default_value == NULL) {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
669 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
670 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
671
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
672 return NGX_CONF_OK;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
673 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
674
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
675 if (ctx->binary_include) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
676 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
677 "binary geo range base \"%s\" cannot be mixed with usual entries",
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
678 ctx->include_name.data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
679 return NGX_CONF_ERROR;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
680 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
681
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
682 if (ctx->high.low == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
683 ctx->high.low = ngx_pcalloc(ctx->pool,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
684 0x10000 * sizeof(ngx_http_geo_range_t *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
685 if (ctx->high.low == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
686 return NGX_CONF_ERROR;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
687 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
688 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
689
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
690 ctx->entries++;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
691 ctx->outside_entries = 1;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
692
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
693 if (ngx_strcmp(value[0].data, "delete") == 0) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
694 net = &value[1];
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
695 del = 1;
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 } else {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
698 net = &value[0];
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
699 del = 0;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
700 }
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 last = net->data + net->len;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
703
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
704 p = ngx_strlchr(net->data, last, '-');
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 if (p == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
707 goto invalid;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
708 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
709
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
710 start = ngx_inet_addr(net->data, p - net->data);
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 if (start == INADDR_NONE) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
713 goto invalid;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
714 }
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 start = ntohl(start);
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 p++;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
719
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
720 end = ngx_inet_addr(p, last - p);
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 if (end == INADDR_NONE) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
723 goto invalid;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
724 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
725
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
726 end = ntohl(end);
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 (start > end) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
729 goto invalid;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
730 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
731
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
732 if (del) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
733 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
734 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
735 "no address range \"%V\" to delete", net);
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
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
738 return NGX_CONF_OK;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
739 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
740
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
741 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
742
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
743 if (ctx->value == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
744 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
745 }
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 ctx->net = net;
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 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
750
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
751 invalid:
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 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
754
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
755 return NGX_CONF_ERROR;
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
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
758
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
759 /* 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
760
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
761 static char *
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
762 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
763 in_addr_t start, in_addr_t end)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
764 {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
765 in_addr_t n;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
766 ngx_uint_t h, i, s, e;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
767 ngx_array_t *a;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
768 ngx_http_geo_range_t *range;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
769
3456
91cff7f97a50 fix a geo range if the range includes two or more /16 networks
Igor Sysoev <igor@sysoev.ru>
parents: 3115
diff changeset
770 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
771
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
772 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
773
3d868fc44879 fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents: 2442
diff changeset
774 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
775 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
776 } else {
3d868fc44879 fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents: 2442
diff changeset
777 s = 0;
3d868fc44879 fix range start for ranges those spread in two or more slots
Igor Sysoev <igor@sysoev.ru>
parents: 2442
diff changeset
778 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
779
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
780 if ((n | 0xffff) > end) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
781 e = end & 0xffff;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
782
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
783 } else {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
784 e = 0xffff;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
785 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
786
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
787 a = (ngx_array_t *) ctx->high.low[h];
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
788
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
789 if (a == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
790 a = ngx_array_create(ctx->temp_pool, 64,
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
791 sizeof(ngx_http_geo_range_t));
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
792 if (a == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
793 return NGX_CONF_ERROR;
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
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
796 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
797 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
798
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
799 i = a->nelts;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
800 range = a->elts;
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 while (i) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
803
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
804 i--;
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 (e < (ngx_uint_t) range[i].start) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
807 continue;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
808 }
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 if (s > (ngx_uint_t) range[i].end) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
811
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
812 /* add after the range */
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 range = ngx_array_push(a);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
815 if (range == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
816 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
817 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
818
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
819 range = a->elts;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
820
3887
e7798b5e990a use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents: 3660
diff changeset
821 ngx_memmove(&range[i + 2], &range[i + 1],
6666
3f82c1e7e29e Geo: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6664
diff changeset
822 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
823
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
824 range[i + 1].start = (u_short) s;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
825 range[i + 1].end = (u_short) e;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
826 range[i + 1].value = ctx->value;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
827
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
828 goto next;
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
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
831 if (s == (ngx_uint_t) range[i].start
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
832 && e == (ngx_uint_t) range[i].end)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
833 {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
834 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
835 "duplicate range \"%V\", value: \"%v\", old value: \"%v\"",
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
836 ctx->net, ctx->value, range[i].value);
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
837
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
838 range[i].value = ctx->value;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
839
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
840 goto next;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
841 }
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
842
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
843 if (s > (ngx_uint_t) range[i].start
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
844 && e < (ngx_uint_t) range[i].end)
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
845 {
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
846 /* split the range and insert the new one */
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
847
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
848 range = ngx_array_push(a);
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
849 if (range == NULL) {
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
850 return NGX_CONF_ERROR;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
851 }
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
852
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
853 range = ngx_array_push(a);
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
854 if (range == NULL) {
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
855 return NGX_CONF_ERROR;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
856 }
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
857
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
858 range = a->elts;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
859
3887
e7798b5e990a use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents: 3660
diff changeset
860 ngx_memmove(&range[i + 3], &range[i + 1],
6666
3f82c1e7e29e Geo: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6664
diff changeset
861 (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t));
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
862
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
863 range[i + 2].start = (u_short) (e + 1);
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
864 range[i + 2].end = range[i].end;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
865 range[i + 2].value = range[i].value;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
866
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
867 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
868 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
869 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
870
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
871 range[i].end = (u_short) (s - 1);
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
872
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
873 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
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
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 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
877 && 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
878 {
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 /* 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
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 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
882 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
883 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
884 }
95f078e7d743 allow insertion range if its start or end is the same as existent one
Igor Sysoev <igor@sysoev.ru>
parents: 2451
diff changeset
885
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 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
887
3887
e7798b5e990a use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents: 3660
diff changeset
888 ngx_memmove(&range[i + 1], &range[i],
6666
3f82c1e7e29e Geo: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6664
diff changeset
889 (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
890
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 + 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
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 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
894 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
895 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
896
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 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
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
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 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
901 && 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
902 {
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 /* 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
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 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
906 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
907 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
908 }
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
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 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
911
3887
e7798b5e990a use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents: 3660
diff changeset
912 ngx_memmove(&range[i + 2], &range[i + 1],
6666
3f82c1e7e29e Geo: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6664
diff changeset
913 (a->nelts - 2 - 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
914
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
915 range[i + 1].start = (u_short) s;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
916 range[i + 1].end = (u_short) e;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
917 range[i + 1].value = ctx->value;
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
918
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
919 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
920
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
921 goto next;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
922 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
923
2448
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
924 s = (ngx_uint_t) range[i].start;
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
925 e = (ngx_uint_t) range[i].end;
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
926
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
927 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2448
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
928 "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"",
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
929 ctx->net,
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
930 h >> 8, h & 0xff, s >> 8, s & 0xff,
bbec98632208 log both overrlaped ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2447
diff changeset
931 h >> 8, h & 0xff, e >> 8, e & 0xff);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
932
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
933 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
934 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
935
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
936 /* add the first range */
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 range = ngx_array_push(a);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
939 if (range == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
940 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
941 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
942
6663
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
943 range = a->elts;
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
944
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
945 ngx_memmove(&range[1], &range[0],
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
946 (a->nelts - 1) * sizeof(ngx_http_geo_range_t));
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
947
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
948 range[0].start = (u_short) s;
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
949 range[0].end = (u_short) e;
53198d9bf84f Geo: fixed insertion of ranges specified in descending order.
Ruslan Ermilov <ru@nginx.com>
parents: 6662
diff changeset
950 range[0].value = ctx->value;
2442
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
951
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
952 next:
6978f3827a5c *) fix duplicate geo ranges
Igor Sysoev <igor@sysoev.ru>
parents: 2401
diff changeset
953
6661
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
954 if (h == 0xffff) {
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
955 break;
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
956 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
957 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
958
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
959 return NGX_CONF_OK;
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
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
962
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
963 static ngx_uint_t
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
964 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
965 in_addr_t start, in_addr_t end)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
966 {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
967 in_addr_t n;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
968 ngx_uint_t h, i, s, e, warn;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
969 ngx_array_t *a;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
970 ngx_http_geo_range_t *range;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
971
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
972 warn = 0;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
973
6662
1301a58b5dac Geo: fixed removing a range in certain cases.
Ruslan Ermilov <ru@nginx.com>
parents: 6661
diff changeset
974 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
975
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
976 h = n >> 16;
2449
450a277dad48 repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2448
diff changeset
977
450a277dad48 repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2448
diff changeset
978 if (n == start) {
450a277dad48 repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2448
diff changeset
979 s = n & 0xffff;
450a277dad48 repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2448
diff changeset
980 } else {
450a277dad48 repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2448
diff changeset
981 s = 0;
450a277dad48 repeat r2448 for range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2448
diff changeset
982 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
983
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
984 if ((n | 0xffff) > end) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
985 e = end & 0xffff;
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 } else {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
988 e = 0xffff;
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
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
991 a = (ngx_array_t *) ctx->high.low[h];
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
992
6664
0ee6f023ef92 Geo: fixed warnings when removing nonexistent ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6663
diff changeset
993 if (a == NULL || a->nelts == 0) {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
994 warn = 1;
6661
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
995 goto next;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
996 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
997
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
998 range = a->elts;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
999 for (i = 0; i < a->nelts; i++) {
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 {
3887
e7798b5e990a use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents: 3660
diff changeset
1004 ngx_memmove(&range[i], &range[i + 1],
6666
3f82c1e7e29e Geo: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6664
diff changeset
1005 (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t));
2450
19b28be544fe fix range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2449
diff changeset
1006
19b28be544fe fix range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2449
diff changeset
1007 a->nelts--;
19b28be544fe fix range deletion
Igor Sysoev <igor@sysoev.ru>
parents: 2449
diff changeset
1008
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1009 break;
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
6664
0ee6f023ef92 Geo: fixed warnings when removing nonexistent ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6663
diff changeset
1012 if (i == a->nelts - 1) {
0ee6f023ef92 Geo: fixed warnings when removing nonexistent ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6663
diff changeset
1013 warn = 1;
2340
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 }
6661
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
1016
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
1017 next:
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
1018
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
1019 if (h == 0xffff) {
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
1020 break;
ec141a44641b Geo: fixed overflow when iterating over ranges.
Ruslan Ermilov <ru@nginx.com>
parents: 6655
diff changeset
1021 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1022 }
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 return warn;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1025 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1026
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1027
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1028 static char *
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1029 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
1030 ngx_str_t *value)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1031 {
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1032 char *rv;
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1033 ngx_int_t rc, del;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1034 ngx_str_t *net;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1035 ngx_cidr_t cidr;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1036
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1037 if (ctx->tree == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1038 ctx->tree = ngx_radix_tree_create(ctx->pool, -1);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1039 if (ctx->tree == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1040 return NGX_CONF_ERROR;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1041 }
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1044 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1045 if (ctx->tree6 == NULL) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1046 ctx->tree6 = ngx_radix_tree_create(ctx->pool, -1);
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1047 if (ctx->tree6 == NULL) {
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1048 return NGX_CONF_ERROR;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1049 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1050 }
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1051 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1052
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1053 if (ngx_strcmp(value[0].data, "default") == 0) {
4993
a8cc59ead621 Geo: properly initialize ngx_cidr_t when dealing with "default".
Ruslan Ermilov <ru@nginx.com>
parents: 4992
diff changeset
1054 cidr.family = AF_INET;
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
1055 cidr.u.in.addr = 0;
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
1056 cidr.u.in.mask = 0;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1057
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1058 rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1059
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1060 if (rv != NGX_CONF_OK) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1061 return rv;
1380
b590a528fd41 ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents: 1352
diff changeset
1062 }
b590a528fd41 ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents: 1352
diff changeset
1063
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1064 #if (NGX_HAVE_INET6)
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1065 cidr.family = AF_INET6;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1066 ngx_memzero(&cidr.u.in6, sizeof(ngx_in6_cidr_t));
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
1067
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1068 rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1069
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1070 if (rv != NGX_CONF_OK) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1071 return rv;
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1072 }
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1073 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1074
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1075 return NGX_CONF_OK;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1076 }
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1077
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1078 if (ngx_strcmp(value[0].data, "delete") == 0) {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1079 net = &value[1];
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1080 del = 1;
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1081
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1082 } else {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1083 net = &value[0];
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1084 del = 0;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1085 }
2365
8522a901df2f fix "delete CIDR"
Igor Sysoev <igor@sysoev.ru>
parents: 2358
diff changeset
1086
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1087 if (ngx_http_geo_cidr_value(cf, net, &cidr) != NGX_OK) {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1088 return NGX_CONF_ERROR;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1089 }
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1090
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1091 if (cidr.family == AF_INET) {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1092 cidr.u.in.addr = ntohl(cidr.u.in.addr);
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1093 cidr.u.in.mask = ntohl(cidr.u.in.mask);
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1094 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1095
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1096 if (del) {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1097 switch (cidr.family) {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1098
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1099 #if (NGX_HAVE_INET6)
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1100 case AF_INET6:
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1101 rc = ngx_radix128tree_delete(ctx->tree6,
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1102 cidr.u.in6.addr.s6_addr,
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1103 cidr.u.in6.mask.s6_addr);
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1104 break;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1105 #endif
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1106
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1107 default: /* AF_INET */
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1108 rc = ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr,
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1109 cidr.u.in.mask);
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1110 break;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1111 }
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1112
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1113 if (rc != NGX_OK) {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1114 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1115 "no network \"%V\" to delete", net);
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1116 }
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1117
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1118 return NGX_CONF_OK;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1119 }
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1120
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1121 return ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], net);
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1122 }
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1123
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1124
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1125 static char *
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1126 ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1127 ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net)
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1128 {
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1129 ngx_int_t rc;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1130 ngx_http_variable_value_t *val, *old;
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1131
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1132 val = ngx_http_geo_value(cf, ctx, value);
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133
2334
6e30d64f919b use value rbtree instead of array in geo configuration
Igor Sysoev <igor@sysoev.ru>
parents: 1565
diff changeset
1134 if (val == NULL) {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1135 return NGX_CONF_ERROR;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1136 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1137
4996
f95b3772d832 Geo: made "default" affect both IPv4 and IPv6 when using prefixes.
Ruslan Ermilov <ru@nginx.com>
parents: 4993
diff changeset
1138 switch (cidr->family) {
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1139
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1140 #if (NGX_HAVE_INET6)
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1141 case AF_INET6:
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1142 rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1143 cidr->u.in6.mask.s6_addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1144 (uintptr_t) val);
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1145
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1146 if (rc == NGX_OK) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1147 return NGX_CONF_OK;
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1148 }
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1149
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1150 if (rc == NGX_ERROR) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1151 return NGX_CONF_ERROR;
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1152 }
553
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1153
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1154 /* rc == NGX_BUSY */
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1155
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1156 old = (ngx_http_variable_value_t *)
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1157 ngx_radix128tree_find(ctx->tree6,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1158 cidr->u.in6.addr.s6_addr);
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1159
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1160 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1161 "duplicate network \"%V\", value: \"%v\", old value: \"%v\"",
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1162 net, val, old);
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1163
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1164 rc = ngx_radix128tree_delete(ctx->tree6,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1165 cidr->u.in6.addr.s6_addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1166 cidr->u.in6.mask.s6_addr);
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1167
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1168 if (rc == NGX_ERROR) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1169 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree");
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1170 return NGX_CONF_ERROR;
553
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1171 }
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1172
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1173 rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1174 cidr->u.in6.mask.s6_addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1175 (uintptr_t) val);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1176
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1177 break;
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1178 #endif
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1179
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1180 default: /* AF_INET */
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1181 rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1182 cidr->u.in.mask, (uintptr_t) val);
553
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1183
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1184 if (rc == NGX_OK) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1185 return NGX_CONF_OK;
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1186 }
553
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1187
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1188 if (rc == NGX_ERROR) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1189 return NGX_CONF_ERROR;
553
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1190 }
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1191
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1192 /* rc == NGX_BUSY */
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1193
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1194 old = (ngx_http_variable_value_t *)
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1195 ngx_radix32tree_find(ctx->tree, cidr->u.in.addr);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1196
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1197 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1198 "duplicate network \"%V\", value: \"%v\", old value: \"%v\"",
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1199 net, val, old);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1200
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1201 rc = ngx_radix32tree_delete(ctx->tree,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1202 cidr->u.in.addr, cidr->u.in.mask);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1203
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1204 if (rc == NGX_ERROR) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1205 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree");
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1206 return NGX_CONF_ERROR;
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1207 }
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1208
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1209 rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr,
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1210 cidr->u.in.mask, (uintptr_t) val);
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1211
4992
3be3de31d7dd Geo: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4989
diff changeset
1212 break;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1213 }
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1214
4999
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1215 if (rc == NGX_OK) {
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1216 return NGX_CONF_OK;
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1217 }
3f776d65c5b9 Geo: improved code readability.
Ruslan Ermilov <ru@nginx.com>
parents: 4996
diff changeset
1218
553
45033d85b30e nginx-0.2.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 547
diff changeset
1219 return NGX_CONF_ERROR;
485
4ebe09b07e30 nginx-0.1.17-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1220 }
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1221
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1222
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1223 static ngx_http_variable_value_t *
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1224 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
1225 ngx_str_t *value)
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1226 {
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
1227 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
1228 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
1229 ngx_http_geo_variable_value_node_t *gvvn;
2340
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 hash = ngx_crc32_long(value->data, value->len);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1232
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
1233 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
1234 ngx_str_rbtree_lookup(&ctx->rbtree, value, hash);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1235
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
1236 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
1237 return gvvn->value;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1238 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1239
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1240 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
1241 if (val == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1242 return NULL;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1243 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1244
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1245 val->len = value->len;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1246 val->data = ngx_pstrdup(ctx->pool, value);
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1247 if (val->data == NULL) {
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1248 return NULL;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1249 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1250
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1251 val->valid = 1;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1252 val->no_cacheable = 0;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1253 val->not_found = 0;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1254
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
1255 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
1256 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
1257 if (gvvn == NULL) {
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1258 return NULL;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1259 }
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1260
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
1261 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
1262 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
1263 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
1264 gvvn->value = val;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1265 gvvn->offset = 0;
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1266
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
1267 ngx_rbtree_insert(&ctx->rbtree, &gvvn->sn.node);
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1268
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1269 ctx->data_size += ngx_align(sizeof(ngx_http_variable_value_t) + value->len,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1270 sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1271
2340
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1272 return val;
22d2b6609853 *) descrease geo configuration memory usage
Igor Sysoev <igor@sysoev.ru>
parents: 2334
diff changeset
1273 }
2992
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 static char *
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1277 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
1278 ngx_cidr_t *cidr)
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1279 {
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
1280 ngx_cidr_t *c;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1281
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1282 if (ctx->proxies == NULL) {
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
1283 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
1284 if (ctx->proxies == NULL) {
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1285 return NGX_CONF_ERROR;
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 }
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1288
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1289 c = ngx_array_push(ctx->proxies);
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1290 if (c == NULL) {
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1291 return NGX_CONF_ERROR;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1292 }
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1293
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
1294 *c = *cidr;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1295
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1296 return NGX_CONF_OK;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1297 }
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 static ngx_int_t
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1301 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
1302 {
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1303 ngx_int_t rc;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1304
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1305 if (ngx_strcmp(net->data, "255.255.255.255") == 0) {
4626
d0db70f4c13b geo: chains of trusted proxies and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4593
diff changeset
1306 cidr->family = AF_INET;
2992
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1307 cidr->u.in.addr = 0xffffffff;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1308 cidr->u.in.mask = 0xffffffff;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1309
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1310 return NGX_OK;
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
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1313 rc = ngx_ptocidr(net, cidr);
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1314
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1315 if (rc == NGX_ERROR) {
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1316 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
1317 return NGX_ERROR;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1318 }
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1319
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1320 if (rc == NGX_DONE) {
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1321 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1322 "low address bits of %V are meaningless", net);
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1323 }
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1324
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1325 return NGX_OK;
2465ff3da161 geo module supports trusted proxies
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
1326 }
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1327
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1328
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1329 static char *
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1330 ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1331 ngx_str_t *name)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1332 {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1333 char *rv;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1334 ngx_str_t file;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1335
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1336 file.len = name->len + 4;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1337 file.data = ngx_pnalloc(ctx->temp_pool, name->len + 5);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1338 if (file.data == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1339 return NGX_CONF_ERROR;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1340 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1341
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1342 ngx_sprintf(file.data, "%V.bin%Z", name);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1343
5330
314c3d7cc3a5 Backed out f1a91825730a and 7094bd12c1ff.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5317
diff changeset
1344 if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) {
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1345 return NGX_CONF_ERROR;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1346 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1347
3654
b56935e34273 test binary geo ranges base only for ranges
Igor Sysoev <igor@sysoev.ru>
parents: 3653
diff changeset
1348 if (ctx->ranges) {
3660
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1349 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1350
3660
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1351 switch (ngx_http_geo_include_binary_base(cf, ctx, &file)) {
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1352 case NGX_OK:
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1353 return NGX_CONF_OK;
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1354 case NGX_ERROR:
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1355 return NGX_CONF_ERROR;
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1356 default:
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1357 break;
564b4ca17cb3 style fix: remove tabs
Igor Sysoev <igor@sysoev.ru>
parents: 3656
diff changeset
1358 }
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1359 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1360
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1361 file.len -= 4;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1362 file.data[file.len] = '\0';
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1363
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1364 ctx->include_name = file;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1365
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1366 if (ctx->outside_entries) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1367 ctx->allow_binary_include = 0;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1368 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1369
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1370 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1371
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1372 rv = ngx_conf_parse(cf, &file);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1373
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1374 ctx->includes++;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1375 ctx->outside_entries = 0;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1376
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1377 return rv;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1378 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1379
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1380
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1381 static ngx_int_t
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1382 ngx_http_geo_include_binary_base(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1383 ngx_str_t *name)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1384 {
3653
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1385 u_char *base, ch;
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1386 time_t mtime;
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1387 size_t size, len;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1388 ssize_t n;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1389 uint32_t crc32;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1390 ngx_err_t err;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1391 ngx_int_t rc;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1392 ngx_uint_t i;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1393 ngx_file_t file;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1394 ngx_file_info_t fi;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1395 ngx_http_geo_range_t *range, **ranges;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1396 ngx_http_geo_header_t *header;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1397 ngx_http_variable_value_t *vv;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1398
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1399 ngx_memzero(&file, sizeof(ngx_file_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1400 file.name = *name;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1401 file.log = cf->log;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1402
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1403 file.fd = ngx_open_file(name->data, NGX_FILE_RDONLY, 0, 0);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1404 if (file.fd == NGX_INVALID_FILE) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1405 err = ngx_errno;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1406 if (err != NGX_ENOENT) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1407 ngx_conf_log_error(NGX_LOG_CRIT, cf, err,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1408 ngx_open_file_n " \"%s\" failed", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1409 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1410 return NGX_DECLINED;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1411 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1412
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1413 if (ctx->outside_entries) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1414 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
1415 "binary geo range base \"%s\" cannot be mixed with usual entries",
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1416 name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1417 rc = NGX_ERROR;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1418 goto done;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1419 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1420
3655
ec20f1f93aea test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents: 3654
diff changeset
1421 if (ctx->binary_include) {
ec20f1f93aea test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents: 3654
diff changeset
1422 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
1423 "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
1424 name->data, ctx->include_name.data);
ec20f1f93aea test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents: 3654
diff changeset
1425 rc = NGX_ERROR;
ec20f1f93aea test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents: 3654
diff changeset
1426 goto done;
ec20f1f93aea test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents: 3654
diff changeset
1427 }
ec20f1f93aea test the second binary geo range base existence
Igor Sysoev <igor@sysoev.ru>
parents: 3654
diff changeset
1428
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1429 if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1430 ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1431 ngx_fd_info_n " \"%s\" failed", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1432 goto failed;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1433 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1434
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1435 size = (size_t) ngx_file_size(&fi);
3653
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1436 mtime = ngx_file_mtime(&fi);
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1437
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1438 ch = name->data[name->len - 4];
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1439 name->data[name->len - 4] = '\0';
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1440
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1441 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
1442 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
1443 ngx_file_info_n " \"%s\" failed", name->data);
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1444 goto failed;
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1445 }
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1446
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1447 name->data[name->len - 4] = ch;
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1448
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1449 if (mtime < ngx_file_mtime(&fi)) {
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1450 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
1451 "stale binary geo range base \"%s\"", name->data);
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1452 goto failed;
be3f716ba546 test binary gep range base mtime
Igor Sysoev <igor@sysoev.ru>
parents: 3652
diff changeset
1453 }
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1454
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1455 base = ngx_palloc(ctx->pool, size);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1456 if (base == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1457 goto failed;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1458 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1459
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1460 n = ngx_read_file(&file, base, size, 0);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1461
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1462 if (n == NGX_ERROR) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1463 ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1464 ngx_read_file_n " \"%s\" failed", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1465 goto failed;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1466 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1467
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1468 if ((size_t) n != size) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1469 ngx_conf_log_error(NGX_LOG_CRIT, cf, 0,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1470 ngx_read_file_n " \"%s\" returned only %z bytes instead of %z",
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1471 name->data, n, size);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1472 goto failed;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1473 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1474
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1475 header = (ngx_http_geo_header_t *) base;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1476
3656
3d61601f3171 test binary geo range base size
Igor Sysoev <igor@sysoev.ru>
parents: 3655
diff changeset
1477 if (size < 16 || ngx_memcmp(&ngx_http_geo_header, header, 12) != 0) {
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1478 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1479 "incompatible binary geo range base \"%s\"", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1480 goto failed;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1481 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1482
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1483 ngx_crc32_init(crc32);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1484
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1485 vv = (ngx_http_variable_value_t *) (base + sizeof(ngx_http_geo_header_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1486
5757
c5ec6944de98 Style: add whitespace between control statement and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5330
diff changeset
1487 while (vv->data) {
3652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1488 len = ngx_align(sizeof(ngx_http_variable_value_t) + vv->len,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1489 sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1490 ngx_crc32_update(&crc32, (u_char *) vv, len);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1491 vv->data += (size_t) base;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1492 vv = (ngx_http_variable_value_t *) ((u_char *) vv + len);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1493 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1494 ngx_crc32_update(&crc32, (u_char *) vv, sizeof(ngx_http_variable_value_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1495 vv++;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1496
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1497 ranges = (ngx_http_geo_range_t **) vv;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1498
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1499 for (i = 0; i < 0x10000; i++) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1500 ngx_crc32_update(&crc32, (u_char *) &ranges[i], sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1501 if (ranges[i]) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1502 ranges[i] = (ngx_http_geo_range_t *)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1503 ((u_char *) ranges[i] + (size_t) base);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1504 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1505 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1506
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1507 range = (ngx_http_geo_range_t *) &ranges[0x10000];
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1508
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1509 while ((u_char *) range < base + size) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1510 while (range->value) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1511 ngx_crc32_update(&crc32, (u_char *) range,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1512 sizeof(ngx_http_geo_range_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1513 range->value = (ngx_http_variable_value_t *)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1514 ((u_char *) range->value + (size_t) base);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1515 range++;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1516 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1517 ngx_crc32_update(&crc32, (u_char *) range, sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1518 range = (ngx_http_geo_range_t *) ((u_char *) range + sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1519 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1520
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1521 ngx_crc32_final(crc32);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1522
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1523 if (crc32 != header->crc32) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1524 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1525 "CRC32 mismatch in binary geo range base \"%s\"", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1526 goto failed;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1527 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1528
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1529 ngx_conf_log_error(NGX_LOG_NOTICE, cf, 0,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1530 "using binary geo range base \"%s\"", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1531
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1532 ctx->include_name = *name;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1533 ctx->binary_include = 1;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1534 ctx->high.low = ranges;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1535 rc = NGX_OK;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1536
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1537 goto done;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1538
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1539 failed:
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1540
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1541 rc = NGX_DECLINED;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1542
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1543 done:
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1544
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1545 if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1546 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1547 ngx_close_file_n " \"%s\" failed", name->data);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1548 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1549
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1550 return rc;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1551 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1552
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1553
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1554 static void
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1555 ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1556 {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1557 u_char *p;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1558 uint32_t hash;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1559 ngx_str_t s;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1560 ngx_uint_t i;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1561 ngx_file_mapping_t fm;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1562 ngx_http_geo_range_t *r, *range, **ranges;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1563 ngx_http_geo_header_t *header;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1564 ngx_http_geo_variable_value_node_t *gvvn;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1565
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1566 fm.name = ngx_pnalloc(ctx->temp_pool, ctx->include_name.len + 5);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1567 if (fm.name == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1568 return;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1569 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1570
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1571 ngx_sprintf(fm.name, "%V.bin%Z", &ctx->include_name);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1572
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1573 fm.size = ctx->data_size;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1574 fm.log = ctx->pool->log;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1575
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1576 ngx_log_error(NGX_LOG_NOTICE, fm.log, 0,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1577 "creating binary geo range base \"%s\"", fm.name);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1578
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1579 if (ngx_create_file_mapping(&fm) != NGX_OK) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1580 return;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1581 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1582
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1583 p = ngx_cpymem(fm.addr, &ngx_http_geo_header,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1584 sizeof(ngx_http_geo_header_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1585
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1586 p = ngx_http_geo_copy_values(fm.addr, p, ctx->rbtree.root,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1587 ctx->rbtree.sentinel);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1588
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1589 p += sizeof(ngx_http_variable_value_t);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1590
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1591 ranges = (ngx_http_geo_range_t **) p;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1592
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1593 p += 0x10000 * sizeof(ngx_http_geo_range_t *);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1594
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1595 for (i = 0; i < 0x10000; i++) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1596 r = ctx->high.low[i];
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1597 if (r == NULL) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1598 continue;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1599 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1600
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1601 range = (ngx_http_geo_range_t *) p;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1602 ranges[i] = (ngx_http_geo_range_t *) (p - (u_char *) fm.addr);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1603
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1604 do {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1605 s.len = r->value->len;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1606 s.data = r->value->data;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1607 hash = ngx_crc32_long(s.data, s.len);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1608 gvvn = (ngx_http_geo_variable_value_node_t *)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1609 ngx_str_rbtree_lookup(&ctx->rbtree, &s, hash);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1610
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1611 range->value = (ngx_http_variable_value_t *) gvvn->offset;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1612 range->start = r->start;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1613 range->end = r->end;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1614 range++;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1615
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1616 } while ((++r)->value);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1617
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1618 range->value = NULL;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1619
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1620 p = (u_char *) range + sizeof(void *);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1621 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1622
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1623 header = fm.addr;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1624 header->crc32 = ngx_crc32_long((u_char *) fm.addr
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1625 + sizeof(ngx_http_geo_header_t),
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1626 fm.size - sizeof(ngx_http_geo_header_t));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1627
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1628 ngx_close_file_mapping(&fm);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1629 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1630
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1631
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1632 static u_char *
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1633 ngx_http_geo_copy_values(u_char *base, u_char *p, ngx_rbtree_node_t *node,
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1634 ngx_rbtree_node_t *sentinel)
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1635 {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1636 ngx_http_variable_value_t *vv;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1637 ngx_http_geo_variable_value_node_t *gvvn;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1638
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1639 if (node == sentinel) {
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1640 return p;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1641 }
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1642
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1643 gvvn = (ngx_http_geo_variable_value_node_t *) node;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1644 gvvn->offset = p - base;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1645
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1646 vv = (ngx_http_variable_value_t *) p;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1647 *vv = *gvvn->value;
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1648 p += sizeof(ngx_http_variable_value_t);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1649 vv->data = (u_char *) (p - base);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1650
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1651 p = ngx_cpymem(p, gvvn->sn.str.data, gvvn->sn.str.len);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1652
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1653 p = ngx_align_ptr(p, sizeof(void *));
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1654
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1655 p = ngx_http_geo_copy_values(base, p, node->left, sentinel);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1656
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1657 return ngx_http_geo_copy_values(base, p, node->right, sentinel);
1eea82e36053 binary geo ranges base cache
Igor Sysoev <igor@sysoev.ru>
parents: 3650
diff changeset
1658 }