annotate src/http/modules/ngx_http_geo_module.c @ 5161:a5f7d455e271 stable-1.2

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