Mercurial > hg > nginx
annotate src/http/modules/ngx_http_geoip_module.c @ 4694:5b5c07dee156
Upstream keepalive: "single" parameter deprecated.
The original idea was to optimize edge cases in case of interchangeable
backends, i.e. don't establish a new connection if we have any one
cached. This causes more harm than good though, as it screws up
underlying balancer's idea about backends used and may result in
various unexpected problems.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 18 Jun 2012 14:23:42 +0000 |
parents | 95d93f7e6fa2 |
children | f57154322e0e |
rev | line source |
---|---|
2985 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
2985 | 5 */ |
6 | |
7 | |
8 #include <ngx_config.h> | |
9 #include <ngx_core.h> | |
10 #include <ngx_http.h> | |
11 | |
12 #include <GeoIP.h> | |
13 #include <GeoIPCity.h> | |
14 | |
15 | |
16 typedef struct { | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
17 GeoIP *country; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
18 GeoIP *org; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
19 GeoIP *city; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
20 ngx_array_t *proxies; /* array of ngx_cidr_t */ |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
21 ngx_flag_t proxy_recursive; |
2985 | 22 } ngx_http_geoip_conf_t; |
23 | |
24 | |
25 typedef struct { | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
26 ngx_str_t *name; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
27 uintptr_t data; |
2985 | 28 } ngx_http_geoip_var_t; |
29 | |
30 | |
4649
95d93f7e6fa2
geoip: got rid of ugly casts when calling ngx_free().
Ruslan Ermilov <ru@nginx.com>
parents:
4648
diff
changeset
|
31 typedef char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, u_long addr); |
2985 | 32 |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
33 static u_long ngx_http_geoip_addr(ngx_http_request_t *r, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
34 ngx_http_geoip_conf_t *gcf); |
2985 | 35 static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r, |
36 ngx_http_variable_value_t *v, uintptr_t data); | |
3915 | 37 static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r, |
38 ngx_http_variable_value_t *v, uintptr_t data); | |
2985 | 39 static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r, |
40 ngx_http_variable_value_t *v, uintptr_t data); | |
3737 | 41 static ngx_int_t ngx_http_geoip_region_name_variable(ngx_http_request_t *r, |
42 ngx_http_variable_value_t *v, uintptr_t data); | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
43 static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
44 ngx_http_variable_value_t *v, uintptr_t data); |
3736
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
45 static ngx_int_t ngx_http_geoip_city_int_variable(ngx_http_request_t *r, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
46 ngx_http_variable_value_t *v, uintptr_t data); |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
47 static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r); |
2985 | 48 |
49 static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf); | |
50 static void *ngx_http_geoip_create_conf(ngx_conf_t *cf); | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
51 static char *ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf); |
2985 | 52 static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, |
53 void *conf); | |
3915 | 54 static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, |
55 void *conf); | |
2985 | 56 static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, |
57 void *conf); | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
58 static char *ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
59 void *conf); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
60 static ngx_int_t ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
61 ngx_cidr_t *cidr); |
2985 | 62 static void ngx_http_geoip_cleanup(void *data); |
63 | |
64 | |
65 static ngx_command_t ngx_http_geoip_commands[] = { | |
66 | |
67 { ngx_string("geoip_country"), | |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
68 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, |
2985 | 69 ngx_http_geoip_country, |
70 NGX_HTTP_MAIN_CONF_OFFSET, | |
71 0, | |
72 NULL }, | |
73 | |
3915 | 74 { ngx_string("geoip_org"), |
75 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, | |
76 ngx_http_geoip_org, | |
77 NGX_HTTP_MAIN_CONF_OFFSET, | |
78 0, | |
79 NULL }, | |
80 | |
2985 | 81 { ngx_string("geoip_city"), |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
82 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, |
2985 | 83 ngx_http_geoip_city, |
84 NGX_HTTP_MAIN_CONF_OFFSET, | |
85 0, | |
86 NULL }, | |
87 | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
88 { ngx_string("geoip_proxy"), |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
89 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
90 ngx_http_geoip_proxy, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
91 NGX_HTTP_MAIN_CONF_OFFSET, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
92 0, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
93 NULL }, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
94 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
95 { ngx_string("geoip_proxy_recursive"), |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
96 NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
97 ngx_conf_set_flag_slot, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
98 NGX_HTTP_MAIN_CONF_OFFSET, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
99 offsetof(ngx_http_geoip_conf_t, proxy_recursive), |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
100 NULL }, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
101 |
2985 | 102 ngx_null_command |
103 }; | |
104 | |
105 | |
106 static ngx_http_module_t ngx_http_geoip_module_ctx = { | |
107 ngx_http_geoip_add_variables, /* preconfiguration */ | |
108 NULL, /* postconfiguration */ | |
109 | |
110 ngx_http_geoip_create_conf, /* create main configuration */ | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
111 ngx_http_geoip_init_conf, /* init main configuration */ |
2985 | 112 |
113 NULL, /* create server configuration */ | |
114 NULL, /* merge server configuration */ | |
115 | |
116 NULL, /* create location configuration */ | |
117 NULL /* merge location configuration */ | |
118 }; | |
119 | |
120 | |
121 ngx_module_t ngx_http_geoip_module = { | |
122 NGX_MODULE_V1, | |
123 &ngx_http_geoip_module_ctx, /* module context */ | |
124 ngx_http_geoip_commands, /* module directives */ | |
125 NGX_HTTP_MODULE, /* module type */ | |
126 NULL, /* init master */ | |
127 NULL, /* init module */ | |
128 NULL, /* init process */ | |
129 NULL, /* init thread */ | |
130 NULL, /* exit thread */ | |
131 NULL, /* exit process */ | |
132 NULL, /* exit master */ | |
133 NGX_MODULE_V1_PADDING | |
134 }; | |
135 | |
136 | |
137 static ngx_http_variable_t ngx_http_geoip_vars[] = { | |
138 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
139 { ngx_string("geoip_country_code"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
140 ngx_http_geoip_country_variable, |
2985 | 141 (uintptr_t) GeoIP_country_code_by_ipnum, 0, 0 }, |
142 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
143 { ngx_string("geoip_country_code3"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
144 ngx_http_geoip_country_variable, |
2985 | 145 (uintptr_t) GeoIP_country_code3_by_ipnum, 0, 0 }, |
146 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
147 { ngx_string("geoip_country_name"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
148 ngx_http_geoip_country_variable, |
2985 | 149 (uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 }, |
150 | |
3915 | 151 { ngx_string("geoip_org"), NULL, |
152 ngx_http_geoip_org_variable, | |
153 (uintptr_t) GeoIP_name_by_ipnum, 0, 0 }, | |
154 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
155 { ngx_string("geoip_city_continent_code"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
156 ngx_http_geoip_city_variable, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
157 offsetof(GeoIPRecord, continent_code), 0, 0 }, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
158 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
159 { ngx_string("geoip_city_country_code"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
160 ngx_http_geoip_city_variable, |
2985 | 161 offsetof(GeoIPRecord, country_code), 0, 0 }, |
162 | |
163 { ngx_string("geoip_city_country_code3"), NULL, | |
164 ngx_http_geoip_city_variable, | |
165 offsetof(GeoIPRecord, country_code3), 0, 0 }, | |
166 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
167 { ngx_string("geoip_city_country_name"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
168 ngx_http_geoip_city_variable, |
2985 | 169 offsetof(GeoIPRecord, country_name), 0, 0 }, |
170 | |
171 { ngx_string("geoip_region"), NULL, | |
172 ngx_http_geoip_city_variable, | |
173 offsetof(GeoIPRecord, region), 0, 0 }, | |
174 | |
3737 | 175 { ngx_string("geoip_region_name"), NULL, |
176 ngx_http_geoip_region_name_variable, | |
177 0, 0, 0 }, | |
178 | |
2985 | 179 { ngx_string("geoip_city"), NULL, |
180 ngx_http_geoip_city_variable, | |
181 offsetof(GeoIPRecord, city), 0, 0 }, | |
182 | |
183 { ngx_string("geoip_postal_code"), NULL, | |
184 ngx_http_geoip_city_variable, | |
185 offsetof(GeoIPRecord, postal_code), 0, 0 }, | |
186 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
187 { ngx_string("geoip_latitude"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
188 ngx_http_geoip_city_float_variable, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
189 offsetof(GeoIPRecord, latitude), 0, 0 }, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
190 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
191 { ngx_string("geoip_longitude"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
192 ngx_http_geoip_city_float_variable, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
193 offsetof(GeoIPRecord, longitude), 0, 0 }, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
194 |
3736
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
195 { ngx_string("geoip_dma_code"), NULL, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
196 ngx_http_geoip_city_int_variable, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
197 offsetof(GeoIPRecord, dma_code), 0, 0 }, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
198 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
199 { ngx_string("geoip_area_code"), NULL, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
200 ngx_http_geoip_city_int_variable, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
201 offsetof(GeoIPRecord, area_code), 0, 0 }, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
202 |
2985 | 203 { ngx_null_string, NULL, NULL, 0, 0, 0 } |
204 }; | |
205 | |
206 | |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
207 static u_long |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
208 ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf) |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
209 { |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
210 ngx_addr_t addr; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
211 ngx_table_elt_t *xfwd; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
212 struct sockaddr_in *sin; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
213 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
214 addr.sockaddr = r->connection->sockaddr; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
215 addr.socklen = r->connection->socklen; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
216 /* addr.name = r->connection->addr_text; */ |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
217 |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
218 xfwd = r->headers_in.x_forwarded_for; |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
219 |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
220 if (xfwd != NULL && gcf->proxies != NULL) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
221 (void) ngx_http_get_forwarded_addr(r, &addr, xfwd->value.data, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
222 xfwd->value.len, gcf->proxies, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
223 gcf->proxy_recursive); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
224 } |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
225 |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
226 #if (NGX_HAVE_INET6) |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
227 |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
228 if (addr.sockaddr->sa_family == AF_INET6) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
229 struct in6_addr *inaddr6; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
230 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
231 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
232 |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
233 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
234 return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]); |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
235 } |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
236 } |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
237 |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
238 #endif |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
239 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
240 if (addr.sockaddr->sa_family != AF_INET) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
241 return INADDR_NONE; |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
242 } |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
243 |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
244 sin = (struct sockaddr_in *) addr.sockaddr; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
245 return ntohl(sin->sin_addr.s_addr); |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
246 } |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
247 |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
248 |
2985 | 249 static ngx_int_t |
250 ngx_http_geoip_country_variable(ngx_http_request_t *r, | |
251 ngx_http_variable_value_t *v, uintptr_t data) | |
252 { | |
253 ngx_http_geoip_variable_handler_pt handler = | |
254 (ngx_http_geoip_variable_handler_pt) data; | |
255 | |
256 const char *val; | |
257 ngx_http_geoip_conf_t *gcf; | |
258 | |
259 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); | |
260 | |
261 if (gcf->country == NULL) { | |
262 goto not_found; | |
263 } | |
264 | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
265 val = handler(gcf->country, ngx_http_geoip_addr(r, gcf)); |
2985 | 266 |
267 if (val == NULL) { | |
268 goto not_found; | |
269 } | |
270 | |
271 v->len = ngx_strlen(val); | |
272 v->valid = 1; | |
273 v->no_cacheable = 0; | |
274 v->not_found = 0; | |
275 v->data = (u_char *) val; | |
276 | |
277 return NGX_OK; | |
278 | |
279 not_found: | |
280 | |
281 v->not_found = 1; | |
282 | |
283 return NGX_OK; | |
284 } | |
285 | |
286 | |
287 static ngx_int_t | |
3915 | 288 ngx_http_geoip_org_variable(ngx_http_request_t *r, |
289 ngx_http_variable_value_t *v, uintptr_t data) | |
290 { | |
291 ngx_http_geoip_variable_handler_pt handler = | |
292 (ngx_http_geoip_variable_handler_pt) data; | |
293 | |
4647
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
294 size_t len; |
4649
95d93f7e6fa2
geoip: got rid of ugly casts when calling ngx_free().
Ruslan Ermilov <ru@nginx.com>
parents:
4648
diff
changeset
|
295 char *val; |
3915 | 296 ngx_http_geoip_conf_t *gcf; |
297 | |
298 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); | |
299 | |
300 if (gcf->org == NULL) { | |
301 goto not_found; | |
302 } | |
303 | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
304 val = handler(gcf->org, ngx_http_geoip_addr(r, gcf)); |
3915 | 305 |
306 if (val == NULL) { | |
307 goto not_found; | |
308 } | |
309 | |
4647
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
310 len = ngx_strlen(val); |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
311 v->data = ngx_pnalloc(r->pool, len); |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
312 if (v->data == NULL) { |
4649
95d93f7e6fa2
geoip: got rid of ugly casts when calling ngx_free().
Ruslan Ermilov <ru@nginx.com>
parents:
4648
diff
changeset
|
313 ngx_free(val); |
4647
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
314 return NGX_ERROR; |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
315 } |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
316 |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
317 ngx_memcpy(v->data, val, len); |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
318 |
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
319 v->len = len; |
3915 | 320 v->valid = 1; |
321 v->no_cacheable = 0; | |
322 v->not_found = 0; | |
4647
a321eadcb16c
Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents:
4627
diff
changeset
|
323 |
4649
95d93f7e6fa2
geoip: got rid of ugly casts when calling ngx_free().
Ruslan Ermilov <ru@nginx.com>
parents:
4648
diff
changeset
|
324 ngx_free(val); |
3915 | 325 |
326 return NGX_OK; | |
327 | |
328 not_found: | |
329 | |
330 v->not_found = 1; | |
331 | |
332 return NGX_OK; | |
333 } | |
334 | |
335 | |
336 static ngx_int_t | |
2985 | 337 ngx_http_geoip_city_variable(ngx_http_request_t *r, |
338 ngx_http_variable_value_t *v, uintptr_t data) | |
339 { | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
340 char *val; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
341 size_t len; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
342 GeoIPRecord *gr; |
2985 | 343 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
344 gr = ngx_http_geoip_get_city_record(r); |
2985 | 345 if (gr == NULL) { |
346 goto not_found; | |
347 } | |
348 | |
349 val = *(char **) ((char *) gr + data); | |
350 if (val == NULL) { | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
351 goto no_value; |
2985 | 352 } |
353 | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
354 len = ngx_strlen(val); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
355 v->data = ngx_pnalloc(r->pool, len); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
356 if (v->data == NULL) { |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
357 GeoIPRecord_delete(gr); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
358 return NGX_ERROR; |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
359 } |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
360 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
361 ngx_memcpy(v->data, val, len); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
362 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
363 v->len = len; |
2985 | 364 v->valid = 1; |
365 v->no_cacheable = 0; | |
366 v->not_found = 0; | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
367 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
368 GeoIPRecord_delete(gr); |
2985 | 369 |
370 return NGX_OK; | |
371 | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
372 no_value: |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
373 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
374 GeoIPRecord_delete(gr); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
375 |
2985 | 376 not_found: |
377 | |
378 v->not_found = 1; | |
379 | |
380 return NGX_OK; | |
381 } | |
382 | |
383 | |
384 static ngx_int_t | |
3737 | 385 ngx_http_geoip_region_name_variable(ngx_http_request_t *r, |
386 ngx_http_variable_value_t *v, uintptr_t data) | |
387 { | |
388 size_t len; | |
389 const char *val; | |
390 GeoIPRecord *gr; | |
391 | |
392 gr = ngx_http_geoip_get_city_record(r); | |
393 if (gr == NULL) { | |
394 goto not_found; | |
395 } | |
396 | |
397 val = GeoIP_region_name_by_code(gr->country_code, gr->region); | |
3742
01691af60f94
we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents:
3741
diff
changeset
|
398 |
01691af60f94
we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents:
3741
diff
changeset
|
399 GeoIPRecord_delete(gr); |
01691af60f94
we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents:
3741
diff
changeset
|
400 |
3741
0f9b2d285bfc
fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents:
3737
diff
changeset
|
401 if (val == NULL) { |
3742
01691af60f94
we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents:
3741
diff
changeset
|
402 goto not_found; |
3741
0f9b2d285bfc
fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents:
3737
diff
changeset
|
403 } |
3737 | 404 |
405 len = ngx_strlen(val); | |
406 v->data = ngx_pnalloc(r->pool, len); | |
407 if (v->data == NULL) { | |
408 return NGX_ERROR; | |
409 } | |
410 | |
411 ngx_memcpy(v->data, val, len); | |
412 | |
413 v->len = len; | |
414 v->valid = 1; | |
415 v->no_cacheable = 0; | |
416 v->not_found = 0; | |
417 | |
418 return NGX_OK; | |
419 | |
420 not_found: | |
421 | |
422 v->not_found = 1; | |
423 | |
424 return NGX_OK; | |
425 } | |
426 | |
427 | |
428 static ngx_int_t | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
429 ngx_http_geoip_city_float_variable(ngx_http_request_t *r, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
430 ngx_http_variable_value_t *v, uintptr_t data) |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
431 { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
432 float val; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
433 GeoIPRecord *gr; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
434 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
435 gr = ngx_http_geoip_get_city_record(r); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
436 if (gr == NULL) { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
437 v->not_found = 1; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
438 return NGX_OK; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
439 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
440 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
441 v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
442 if (v->data == NULL) { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
443 GeoIPRecord_delete(gr); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
444 return NGX_ERROR; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
445 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
446 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
447 val = *(float *) ((char *) gr + data); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
448 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
449 v->len = ngx_sprintf(v->data, "%.4f", val) - v->data; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
450 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
451 GeoIPRecord_delete(gr); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
452 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
453 return NGX_OK; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
454 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
455 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
456 |
3736
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
457 static ngx_int_t |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
458 ngx_http_geoip_city_int_variable(ngx_http_request_t *r, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
459 ngx_http_variable_value_t *v, uintptr_t data) |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
460 { |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
461 int val; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
462 GeoIPRecord *gr; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
463 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
464 gr = ngx_http_geoip_get_city_record(r); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
465 if (gr == NULL) { |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
466 v->not_found = 1; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
467 return NGX_OK; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
468 } |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
469 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
470 v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
471 if (v->data == NULL) { |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
472 GeoIPRecord_delete(gr); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
473 return NGX_ERROR; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
474 } |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
475 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
476 val = *(int *) ((char *) gr + data); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
477 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
478 v->len = ngx_sprintf(v->data, "%d", val) - v->data; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
479 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
480 GeoIPRecord_delete(gr); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
481 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
482 return NGX_OK; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
483 } |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
484 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
485 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
486 static GeoIPRecord * |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
487 ngx_http_geoip_get_city_record(ngx_http_request_t *r) |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
488 { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
489 ngx_http_geoip_conf_t *gcf; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
490 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
491 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
492 |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
493 if (gcf->city) { |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
494 return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r, gcf)); |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
495 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
496 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
497 return NULL; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
498 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
499 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
500 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
501 static ngx_int_t |
2985 | 502 ngx_http_geoip_add_variables(ngx_conf_t *cf) |
503 { | |
504 ngx_http_variable_t *var, *v; | |
505 | |
506 for (v = ngx_http_geoip_vars; v->name.len; v++) { | |
507 var = ngx_http_add_variable(cf, &v->name, v->flags); | |
508 if (var == NULL) { | |
509 return NGX_ERROR; | |
510 } | |
511 | |
512 var->get_handler = v->get_handler; | |
513 var->data = v->data; | |
514 } | |
515 | |
516 return NGX_OK; | |
517 } | |
518 | |
519 | |
520 static void * | |
521 ngx_http_geoip_create_conf(ngx_conf_t *cf) | |
522 { | |
523 ngx_pool_cleanup_t *cln; | |
524 ngx_http_geoip_conf_t *conf; | |
525 | |
526 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip_conf_t)); | |
527 if (conf == NULL) { | |
528 return NULL; | |
529 } | |
530 | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
531 conf->proxy_recursive = NGX_CONF_UNSET; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
532 |
2985 | 533 cln = ngx_pool_cleanup_add(cf->pool, 0); |
534 if (cln == NULL) { | |
535 return NULL; | |
536 } | |
537 | |
538 cln->handler = ngx_http_geoip_cleanup; | |
539 cln->data = conf; | |
540 | |
541 return conf; | |
542 } | |
543 | |
544 | |
545 static char * | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
546 ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf) |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
547 { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
548 ngx_http_geoip_conf_t *gcf = conf; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
549 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
550 ngx_conf_init_value(gcf->proxy_recursive, 0); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
551 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
552 return NGX_CONF_OK; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
553 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
554 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
555 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
556 static char * |
2985 | 557 ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
558 { | |
559 ngx_http_geoip_conf_t *gcf = conf; | |
560 | |
561 ngx_str_t *value; | |
562 | |
563 if (gcf->country) { | |
564 return "is duplicate"; | |
565 } | |
566 | |
567 value = cf->args->elts; | |
568 | |
569 gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); | |
570 | |
571 if (gcf->country == NULL) { | |
572 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3914 | 573 "GeoIP_open(\"%V\") failed", &value[1]); |
2985 | 574 |
575 return NGX_CONF_ERROR; | |
576 } | |
577 | |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
578 if (cf->args->nelts == 3) { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
579 if (ngx_strcmp(value[2].data, "utf8") == 0) { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
580 GeoIP_set_charset (gcf->country, GEOIP_CHARSET_UTF8); |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
581 |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
582 } else { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
583 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
584 "invalid parameter \"%V\"", &value[2]); |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
585 return NGX_CONF_ERROR; |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
586 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
587 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
588 |
2985 | 589 switch (gcf->country->databaseType) { |
590 | |
591 case GEOIP_COUNTRY_EDITION: | |
592 case GEOIP_PROXY_EDITION: | |
593 case GEOIP_NETSPEED_EDITION: | |
594 | |
595 return NGX_CONF_OK; | |
596 | |
597 default: | |
598 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
599 "invalid GeoIP database \"%V\" type:%d", | |
600 &value[1], gcf->country->databaseType); | |
601 return NGX_CONF_ERROR; | |
602 } | |
603 } | |
604 | |
605 | |
606 static char * | |
3915 | 607 ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
608 { | |
609 ngx_http_geoip_conf_t *gcf = conf; | |
610 | |
611 ngx_str_t *value; | |
612 | |
613 if (gcf->org) { | |
614 return "is duplicate"; | |
615 } | |
616 | |
617 value = cf->args->elts; | |
618 | |
619 gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); | |
620 | |
621 if (gcf->org == NULL) { | |
622 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
623 "GeoIP_open(\"%V\") failed", &value[1]); | |
624 | |
625 return NGX_CONF_ERROR; | |
626 } | |
627 | |
628 if (cf->args->nelts == 3) { | |
629 if (ngx_strcmp(value[2].data, "utf8") == 0) { | |
630 GeoIP_set_charset (gcf->org, GEOIP_CHARSET_UTF8); | |
631 | |
632 } else { | |
633 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
634 "invalid parameter \"%V\"", &value[2]); | |
635 return NGX_CONF_ERROR; | |
636 } | |
637 } | |
638 | |
639 switch (gcf->org->databaseType) { | |
640 | |
641 case GEOIP_ISP_EDITION: | |
642 case GEOIP_ORG_EDITION: | |
643 case GEOIP_DOMAIN_EDITION: | |
644 case GEOIP_ASNUM_EDITION: | |
645 | |
646 return NGX_CONF_OK; | |
647 | |
648 default: | |
649 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
650 "invalid GeoIP database \"%V\" type:%d", | |
651 &value[1], gcf->org->databaseType); | |
652 return NGX_CONF_ERROR; | |
653 } | |
654 } | |
655 | |
656 | |
657 static char * | |
2985 | 658 ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
659 { | |
660 ngx_http_geoip_conf_t *gcf = conf; | |
661 | |
662 ngx_str_t *value; | |
663 | |
664 if (gcf->city) { | |
665 return "is duplicate"; | |
666 } | |
667 | |
668 value = cf->args->elts; | |
669 | |
670 gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); | |
671 | |
672 if (gcf->city == NULL) { | |
673 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3914 | 674 "GeoIP_open(\"%V\") failed", &value[1]); |
2985 | 675 |
676 return NGX_CONF_ERROR; | |
677 } | |
678 | |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
679 if (cf->args->nelts == 3) { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
680 if (ngx_strcmp(value[2].data, "utf8") == 0) { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
681 GeoIP_set_charset (gcf->city, GEOIP_CHARSET_UTF8); |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
682 |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
683 } else { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
684 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
685 "invalid parameter \"%V\"", &value[2]); |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
686 return NGX_CONF_ERROR; |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
687 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
688 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
689 |
2985 | 690 switch (gcf->city->databaseType) { |
691 | |
692 case GEOIP_CITY_EDITION_REV0: | |
693 case GEOIP_CITY_EDITION_REV1: | |
694 | |
695 return NGX_CONF_OK; | |
696 | |
697 default: | |
698 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
699 "invalid GeoIP City database \"%V\" type:%d", | |
700 &value[1], gcf->city->databaseType); | |
701 return NGX_CONF_ERROR; | |
702 } | |
703 } | |
704 | |
705 | |
4627
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
706 static char * |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
707 ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
708 { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
709 ngx_http_geoip_conf_t *gcf = conf; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
710 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
711 ngx_str_t *value; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
712 ngx_cidr_t cidr, *c; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
713 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
714 value = cf->args->elts; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
715 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
716 if (ngx_http_geoip_cidr_value(cf, &value[1], &cidr) != NGX_OK) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
717 return NGX_CONF_ERROR; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
718 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
719 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
720 if (gcf->proxies == NULL) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
721 gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t)); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
722 if (gcf->proxies == NULL) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
723 return NGX_CONF_ERROR; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
724 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
725 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
726 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
727 c = ngx_array_push(gcf->proxies); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
728 if (c == NULL) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
729 return NGX_CONF_ERROR; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
730 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
731 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
732 *c = cidr; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
733 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
734 return NGX_CONF_OK; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
735 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
736 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
737 static ngx_int_t |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
738 ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
739 { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
740 ngx_int_t rc; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
741 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
742 if (ngx_strcmp(net->data, "255.255.255.255") == 0) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
743 cidr->family = AF_INET; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
744 cidr->u.in.addr = 0xffffffff; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
745 cidr->u.in.mask = 0xffffffff; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
746 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
747 return NGX_OK; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
748 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
749 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
750 rc = ngx_ptocidr(net, cidr); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
751 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
752 if (rc == NGX_ERROR) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
753 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
754 return NGX_ERROR; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
755 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
756 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
757 if (rc == NGX_DONE) { |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
758 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
759 "low address bits of %V are meaningless", net); |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
760 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
761 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
762 return NGX_OK; |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
763 } |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
764 |
3152e4c371d7
geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents:
4412
diff
changeset
|
765 |
2985 | 766 static void |
767 ngx_http_geoip_cleanup(void *data) | |
768 { | |
769 ngx_http_geoip_conf_t *gcf = data; | |
770 | |
771 if (gcf->country) { | |
772 GeoIP_delete(gcf->country); | |
773 } | |
774 | |
3915 | 775 if (gcf->org) { |
776 GeoIP_delete(gcf->org); | |
777 } | |
778 | |
2985 | 779 if (gcf->city) { |
780 GeoIP_delete(gcf->city); | |
781 } | |
782 } |