Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_geoip_module.c @ 5068:91c5ef4ce4bb stable-1.2
release-1.2.7 tag
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 12 Feb 2013 13:40:46 +0000 |
parents | 7ce4ecb6df5c |
children |
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 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
16 #define NGX_GEOIP_COUNTRY_CODE 0 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
17 #define NGX_GEOIP_COUNTRY_CODE3 1 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
18 #define NGX_GEOIP_COUNTRY_NAME 2 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
19 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
20 |
2985 | 21 typedef struct { |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
22 GeoIP *country; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
23 GeoIP *org; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
24 GeoIP *city; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
25 ngx_array_t *proxies; /* array of ngx_cidr_t */ |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
26 ngx_flag_t proxy_recursive; |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
27 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
28 unsigned country_v6:1; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
29 unsigned org_v6:1; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
30 unsigned city_v6:1; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
31 #endif |
2985 | 32 } ngx_http_geoip_conf_t; |
33 | |
34 | |
35 typedef struct { | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
36 ngx_str_t *name; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
37 uintptr_t data; |
2985 | 38 } ngx_http_geoip_var_t; |
39 | |
40 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
41 typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
42 u_long addr); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
43 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
44 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
45 ngx_http_geoip_variable_handler_pt ngx_http_geoip_country_functions[] = { |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
46 GeoIP_country_code_by_ipnum, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
47 GeoIP_country_code3_by_ipnum, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
48 GeoIP_country_name_by_ipnum, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
49 }; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
50 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
51 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
52 #if (NGX_HAVE_GEOIP_V6) |
2985 | 53 |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
54 typedef const char *(*ngx_http_geoip_variable_handler_v6_pt)(GeoIP *, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
55 geoipv6_t addr); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
56 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
57 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
58 ngx_http_geoip_variable_handler_v6_pt ngx_http_geoip_country_v6_functions[] = { |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
59 GeoIP_country_code_by_ipnum_v6, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
60 GeoIP_country_code3_by_ipnum_v6, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
61 GeoIP_country_name_by_ipnum_v6, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
62 }; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
63 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
64 #endif |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
65 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
66 |
2985 | 67 static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r, |
68 ngx_http_variable_value_t *v, uintptr_t data); | |
3915 | 69 static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r, |
70 ngx_http_variable_value_t *v, uintptr_t data); | |
2985 | 71 static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r, |
72 ngx_http_variable_value_t *v, uintptr_t data); | |
3737 | 73 static ngx_int_t ngx_http_geoip_region_name_variable(ngx_http_request_t *r, |
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r); |
2985 | 80 |
81 static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf); | |
82 static void *ngx_http_geoip_create_conf(ngx_conf_t *cf); | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
83 static char *ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf); |
2985 | 84 static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, |
85 void *conf); | |
3915 | 86 static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, |
87 void *conf); | |
2985 | 88 static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, |
89 void *conf); | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
90 static char *ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
91 void *conf); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
92 static ngx_int_t ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
93 ngx_cidr_t *cidr); |
2985 | 94 static void ngx_http_geoip_cleanup(void *data); |
95 | |
96 | |
97 static ngx_command_t ngx_http_geoip_commands[] = { | |
98 | |
99 { ngx_string("geoip_country"), | |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
100 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, |
2985 | 101 ngx_http_geoip_country, |
102 NGX_HTTP_MAIN_CONF_OFFSET, | |
103 0, | |
104 NULL }, | |
105 | |
3915 | 106 { ngx_string("geoip_org"), |
107 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, | |
108 ngx_http_geoip_org, | |
109 NGX_HTTP_MAIN_CONF_OFFSET, | |
110 0, | |
111 NULL }, | |
112 | |
2985 | 113 { ngx_string("geoip_city"), |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
114 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, |
2985 | 115 ngx_http_geoip_city, |
116 NGX_HTTP_MAIN_CONF_OFFSET, | |
117 0, | |
118 NULL }, | |
119 | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
120 { ngx_string("geoip_proxy"), |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
121 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
122 ngx_http_geoip_proxy, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
123 NGX_HTTP_MAIN_CONF_OFFSET, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
124 0, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
125 NULL }, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
126 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
127 { ngx_string("geoip_proxy_recursive"), |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
128 NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
129 ngx_conf_set_flag_slot, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
130 NGX_HTTP_MAIN_CONF_OFFSET, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
131 offsetof(ngx_http_geoip_conf_t, proxy_recursive), |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
132 NULL }, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
133 |
2985 | 134 ngx_null_command |
135 }; | |
136 | |
137 | |
138 static ngx_http_module_t ngx_http_geoip_module_ctx = { | |
139 ngx_http_geoip_add_variables, /* preconfiguration */ | |
140 NULL, /* postconfiguration */ | |
141 | |
142 ngx_http_geoip_create_conf, /* create main configuration */ | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
143 ngx_http_geoip_init_conf, /* init main configuration */ |
2985 | 144 |
145 NULL, /* create server configuration */ | |
146 NULL, /* merge server configuration */ | |
147 | |
148 NULL, /* create location configuration */ | |
149 NULL /* merge location configuration */ | |
150 }; | |
151 | |
152 | |
153 ngx_module_t ngx_http_geoip_module = { | |
154 NGX_MODULE_V1, | |
155 &ngx_http_geoip_module_ctx, /* module context */ | |
156 ngx_http_geoip_commands, /* module directives */ | |
157 NGX_HTTP_MODULE, /* module type */ | |
158 NULL, /* init master */ | |
159 NULL, /* init module */ | |
160 NULL, /* init process */ | |
161 NULL, /* init thread */ | |
162 NULL, /* exit thread */ | |
163 NULL, /* exit process */ | |
164 NULL, /* exit master */ | |
165 NGX_MODULE_V1_PADDING | |
166 }; | |
167 | |
168 | |
169 static ngx_http_variable_t ngx_http_geoip_vars[] = { | |
170 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
171 { ngx_string("geoip_country_code"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
172 ngx_http_geoip_country_variable, |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
173 NGX_GEOIP_COUNTRY_CODE, 0, 0 }, |
2985 | 174 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
175 { ngx_string("geoip_country_code3"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
176 ngx_http_geoip_country_variable, |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
177 NGX_GEOIP_COUNTRY_CODE3, 0, 0 }, |
2985 | 178 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
179 { ngx_string("geoip_country_name"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
180 ngx_http_geoip_country_variable, |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
181 NGX_GEOIP_COUNTRY_NAME, 0, 0 }, |
2985 | 182 |
3915 | 183 { ngx_string("geoip_org"), NULL, |
184 ngx_http_geoip_org_variable, | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
185 0, 0, 0 }, |
3915 | 186 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
187 { 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
|
188 ngx_http_geoip_city_variable, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
189 offsetof(GeoIPRecord, continent_code), 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_city_country_code"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
192 ngx_http_geoip_city_variable, |
2985 | 193 offsetof(GeoIPRecord, country_code), 0, 0 }, |
194 | |
195 { ngx_string("geoip_city_country_code3"), NULL, | |
196 ngx_http_geoip_city_variable, | |
197 offsetof(GeoIPRecord, country_code3), 0, 0 }, | |
198 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
199 { 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
|
200 ngx_http_geoip_city_variable, |
2985 | 201 offsetof(GeoIPRecord, country_name), 0, 0 }, |
202 | |
203 { ngx_string("geoip_region"), NULL, | |
204 ngx_http_geoip_city_variable, | |
205 offsetof(GeoIPRecord, region), 0, 0 }, | |
206 | |
3737 | 207 { ngx_string("geoip_region_name"), NULL, |
208 ngx_http_geoip_region_name_variable, | |
209 0, 0, 0 }, | |
210 | |
2985 | 211 { ngx_string("geoip_city"), NULL, |
212 ngx_http_geoip_city_variable, | |
213 offsetof(GeoIPRecord, city), 0, 0 }, | |
214 | |
215 { ngx_string("geoip_postal_code"), NULL, | |
216 ngx_http_geoip_city_variable, | |
217 offsetof(GeoIPRecord, postal_code), 0, 0 }, | |
218 | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
219 { ngx_string("geoip_latitude"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
220 ngx_http_geoip_city_float_variable, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
221 offsetof(GeoIPRecord, latitude), 0, 0 }, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
222 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
223 { ngx_string("geoip_longitude"), NULL, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
224 ngx_http_geoip_city_float_variable, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
225 offsetof(GeoIPRecord, longitude), 0, 0 }, |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
226 |
3736
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
227 { ngx_string("geoip_dma_code"), NULL, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
228 ngx_http_geoip_city_int_variable, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
229 offsetof(GeoIPRecord, dma_code), 0, 0 }, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
230 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
231 { ngx_string("geoip_area_code"), NULL, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
232 ngx_http_geoip_city_int_variable, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
233 offsetof(GeoIPRecord, area_code), 0, 0 }, |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
234 |
2985 | 235 { ngx_null_string, NULL, NULL, 0, 0, 0 } |
236 }; | |
237 | |
238 | |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
239 static u_long |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
240 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
|
241 { |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
242 ngx_addr_t addr; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
243 ngx_table_elt_t *xfwd; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
244 struct sockaddr_in *sin; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
245 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
246 addr.sockaddr = r->connection->sockaddr; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
247 addr.socklen = r->connection->socklen; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
248 /* 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
|
249 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
250 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
|
251 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
252 if (xfwd != NULL && gcf->proxies != NULL) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
253 (void) ngx_http_get_forwarded_addr(r, &addr, xfwd->value.data, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
254 xfwd->value.len, gcf->proxies, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
255 gcf->proxy_recursive); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
256 } |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
257 |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
258 #if (NGX_HAVE_INET6) |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
259 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
260 if (addr.sockaddr->sa_family == AF_INET6) { |
4857
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
261 u_char *p; |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
262 in_addr_t inaddr; |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
263 struct in6_addr *inaddr6; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
264 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
265 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
|
266 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
267 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { |
4857
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
268 p = inaddr6->s6_addr; |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
269 |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
270 inaddr = p[12] << 24; |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
271 inaddr += p[13] << 16; |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
272 inaddr += p[14] << 8; |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
273 inaddr += p[15]; |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
274 |
880dedfa4008
Merge of r4829: fixed strict aliasing with ipv6 (ticket #201).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4718
diff
changeset
|
275 return inaddr; |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
276 } |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
277 } |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
278 |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
279 #endif |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
280 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
281 if (addr.sockaddr->sa_family != AF_INET) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
282 return INADDR_NONE; |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
283 } |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
284 |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
285 sin = (struct sockaddr_in *) addr.sockaddr; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
286 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
|
287 } |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
288 |
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
289 |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
290 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
291 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
292 static geoipv6_t |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
293 ngx_http_geoip_addr_v6(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
294 { |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
295 ngx_addr_t addr; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
296 ngx_table_elt_t *xfwd; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
297 in_addr_t addr4; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
298 struct in6_addr addr6; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
299 struct sockaddr_in *sin; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
300 struct sockaddr_in6 *sin6; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
301 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
302 addr.sockaddr = r->connection->sockaddr; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
303 addr.socklen = r->connection->socklen; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
304 /* addr.name = r->connection->addr_text; */ |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
305 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
306 xfwd = r->headers_in.x_forwarded_for; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
307 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
308 if (xfwd != NULL && gcf->proxies != NULL) { |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
309 (void) ngx_http_get_forwarded_addr(r, &addr, xfwd->value.data, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
310 xfwd->value.len, gcf->proxies, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
311 gcf->proxy_recursive); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
312 } |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
313 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
314 switch (addr.sockaddr->sa_family) { |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
315 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
316 case AF_INET: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
317 /* Produce IPv4-mapped IPv6 address. */ |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
318 sin = (struct sockaddr_in *) addr.sockaddr; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
319 addr4 = ntohl(sin->sin_addr.s_addr); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
320 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
321 ngx_memzero(&addr6, sizeof(struct in6_addr)); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
322 addr6.s6_addr[10] = 0xff; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
323 addr6.s6_addr[11] = 0xff; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
324 addr6.s6_addr[12] = addr4 >> 24; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
325 addr6.s6_addr[13] = addr4 >> 16; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
326 addr6.s6_addr[14] = addr4 >> 8; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
327 addr6.s6_addr[15] = addr4; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
328 return addr6; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
329 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
330 case AF_INET6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
331 sin6 = (struct sockaddr_in6 *) addr.sockaddr; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
332 return sin6->sin6_addr; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
333 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
334 default: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
335 return in6addr_any; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
336 } |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
337 } |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
338 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
339 #endif |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
340 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
341 |
2985 | 342 static ngx_int_t |
343 ngx_http_geoip_country_variable(ngx_http_request_t *r, | |
344 ngx_http_variable_value_t *v, uintptr_t data) | |
345 { | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
346 ngx_http_geoip_variable_handler_pt handler = |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
347 ngx_http_geoip_country_functions[data]; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
348 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
349 ngx_http_geoip_variable_handler_v6_pt handler_v6 = |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
350 ngx_http_geoip_country_v6_functions[data]; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
351 #endif |
2985 | 352 |
353 const char *val; | |
354 ngx_http_geoip_conf_t *gcf; | |
355 | |
356 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); | |
357 | |
358 if (gcf->country == NULL) { | |
359 goto not_found; | |
360 } | |
361 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
362 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
363 val = gcf->country_v6 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
364 ? handler_v6(gcf->country, ngx_http_geoip_addr_v6(r, gcf)) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
365 : handler(gcf->country, ngx_http_geoip_addr(r, gcf)); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
366 #else |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
367 val = handler(gcf->country, ngx_http_geoip_addr(r, gcf)); |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
368 #endif |
2985 | 369 |
370 if (val == NULL) { | |
371 goto not_found; | |
372 } | |
373 | |
374 v->len = ngx_strlen(val); | |
375 v->valid = 1; | |
376 v->no_cacheable = 0; | |
377 v->not_found = 0; | |
378 v->data = (u_char *) val; | |
379 | |
380 return NGX_OK; | |
381 | |
382 not_found: | |
383 | |
384 v->not_found = 1; | |
385 | |
386 return NGX_OK; | |
387 } | |
388 | |
389 | |
390 static ngx_int_t | |
3915 | 391 ngx_http_geoip_org_variable(ngx_http_request_t *r, |
392 ngx_http_variable_value_t *v, uintptr_t data) | |
393 { | |
4718
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
394 size_t len; |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
395 char *val; |
3915 | 396 ngx_http_geoip_conf_t *gcf; |
397 | |
398 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); | |
399 | |
400 if (gcf->org == NULL) { | |
401 goto not_found; | |
402 } | |
403 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
404 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
405 val = gcf->org_v6 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
406 ? GeoIP_name_by_ipnum_v6(gcf->org, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
407 ngx_http_geoip_addr_v6(r, gcf)) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
408 : GeoIP_name_by_ipnum(gcf->org, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
409 ngx_http_geoip_addr(r, gcf)); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
410 #else |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
411 val = GeoIP_name_by_ipnum(gcf->org, ngx_http_geoip_addr(r, gcf)); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
412 #endif |
3915 | 413 |
414 if (val == NULL) { | |
415 goto not_found; | |
416 } | |
417 | |
4718
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
418 len = ngx_strlen(val); |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
419 v->data = ngx_pnalloc(r->pool, len); |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
420 if (v->data == NULL) { |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
421 ngx_free(val); |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
422 return NGX_ERROR; |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
423 } |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
424 |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
425 ngx_memcpy(v->data, val, len); |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
426 |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
427 v->len = len; |
3915 | 428 v->valid = 1; |
429 v->no_cacheable = 0; | |
430 v->not_found = 0; | |
4718
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
431 |
a05e7b09af5a
Merge of r4648, r4649, r4650: memory leak with $geoip_org.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4668
diff
changeset
|
432 ngx_free(val); |
3915 | 433 |
434 return NGX_OK; | |
435 | |
436 not_found: | |
437 | |
438 v->not_found = 1; | |
439 | |
440 return NGX_OK; | |
441 } | |
442 | |
443 | |
444 static ngx_int_t | |
2985 | 445 ngx_http_geoip_city_variable(ngx_http_request_t *r, |
446 ngx_http_variable_value_t *v, uintptr_t data) | |
447 { | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
448 char *val; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
449 size_t len; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
450 GeoIPRecord *gr; |
2985 | 451 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
452 gr = ngx_http_geoip_get_city_record(r); |
2985 | 453 if (gr == NULL) { |
454 goto not_found; | |
455 } | |
456 | |
457 val = *(char **) ((char *) gr + data); | |
458 if (val == NULL) { | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
459 goto no_value; |
2985 | 460 } |
461 | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
462 len = ngx_strlen(val); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
463 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
|
464 if (v->data == NULL) { |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
465 GeoIPRecord_delete(gr); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
466 return NGX_ERROR; |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
467 } |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
468 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
469 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
|
470 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
471 v->len = len; |
2985 | 472 v->valid = 1; |
473 v->no_cacheable = 0; | |
474 v->not_found = 0; | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
475 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
476 GeoIPRecord_delete(gr); |
2985 | 477 |
478 return NGX_OK; | |
479 | |
3031
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
480 no_value: |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
481 |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
482 GeoIPRecord_delete(gr); |
98a8336c5b7c
fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents:
2985
diff
changeset
|
483 |
2985 | 484 not_found: |
485 | |
486 v->not_found = 1; | |
487 | |
488 return NGX_OK; | |
489 } | |
490 | |
491 | |
492 static ngx_int_t | |
3737 | 493 ngx_http_geoip_region_name_variable(ngx_http_request_t *r, |
494 ngx_http_variable_value_t *v, uintptr_t data) | |
495 { | |
496 size_t len; | |
497 const char *val; | |
498 GeoIPRecord *gr; | |
499 | |
500 gr = ngx_http_geoip_get_city_record(r); | |
501 if (gr == NULL) { | |
502 goto not_found; | |
503 } | |
504 | |
505 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
|
506 |
01691af60f94
we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents:
3741
diff
changeset
|
507 GeoIPRecord_delete(gr); |
01691af60f94
we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents:
3741
diff
changeset
|
508 |
3741
0f9b2d285bfc
fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents:
3737
diff
changeset
|
509 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
|
510 goto not_found; |
3741
0f9b2d285bfc
fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents:
3737
diff
changeset
|
511 } |
3737 | 512 |
513 len = ngx_strlen(val); | |
514 v->data = ngx_pnalloc(r->pool, len); | |
515 if (v->data == NULL) { | |
516 return NGX_ERROR; | |
517 } | |
518 | |
519 ngx_memcpy(v->data, val, len); | |
520 | |
521 v->len = len; | |
522 v->valid = 1; | |
523 v->no_cacheable = 0; | |
524 v->not_found = 0; | |
525 | |
526 return NGX_OK; | |
527 | |
528 not_found: | |
529 | |
530 v->not_found = 1; | |
531 | |
532 return NGX_OK; | |
533 } | |
534 | |
535 | |
536 static ngx_int_t | |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
537 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
|
538 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
|
539 { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
540 float val; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
541 GeoIPRecord *gr; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
542 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
543 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
|
544 if (gr == NULL) { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
545 v->not_found = 1; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
546 return NGX_OK; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
547 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
548 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
549 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
|
550 if (v->data == NULL) { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
551 GeoIPRecord_delete(gr); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
552 return NGX_ERROR; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
553 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
554 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
555 val = *(float *) ((char *) gr + data); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
556 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
557 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
|
558 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
559 GeoIPRecord_delete(gr); |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
560 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
561 return NGX_OK; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
562 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
563 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
564 |
3736
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
565 static ngx_int_t |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
566 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
|
567 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
|
568 { |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
569 int val; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
570 GeoIPRecord *gr; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
571 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
572 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
|
573 if (gr == NULL) { |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
574 v->not_found = 1; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
575 return NGX_OK; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
576 } |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
577 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
578 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
|
579 if (v->data == NULL) { |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
580 GeoIPRecord_delete(gr); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
581 return NGX_ERROR; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
582 } |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
583 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
584 val = *(int *) ((char *) gr + data); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
585 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
586 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
|
587 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
588 GeoIPRecord_delete(gr); |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
589 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
590 return NGX_OK; |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
591 } |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
592 |
257785918797
$geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents:
3398
diff
changeset
|
593 |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
594 static GeoIPRecord * |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
595 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
|
596 { |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
597 ngx_http_geoip_conf_t *gcf; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
598 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
599 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
|
600 |
3919
0dceaa117e0d
support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents:
3915
diff
changeset
|
601 if (gcf->city) { |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
602 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
603 return gcf->city_v6 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
604 ? GeoIP_record_by_ipnum_v6(gcf->city, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
605 ngx_http_geoip_addr_v6(r, gcf)) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
606 : GeoIP_record_by_ipnum(gcf->city, |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
607 ngx_http_geoip_addr(r, gcf)); |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
608 #else |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
609 return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r, gcf)); |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
610 #endif |
3398
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
611 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
612 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
613 return NULL; |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
614 } |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
615 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
616 |
236634d2b603
$geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents:
3031
diff
changeset
|
617 static ngx_int_t |
2985 | 618 ngx_http_geoip_add_variables(ngx_conf_t *cf) |
619 { | |
620 ngx_http_variable_t *var, *v; | |
621 | |
622 for (v = ngx_http_geoip_vars; v->name.len; v++) { | |
623 var = ngx_http_add_variable(cf, &v->name, v->flags); | |
624 if (var == NULL) { | |
625 return NGX_ERROR; | |
626 } | |
627 | |
628 var->get_handler = v->get_handler; | |
629 var->data = v->data; | |
630 } | |
631 | |
632 return NGX_OK; | |
633 } | |
634 | |
635 | |
636 static void * | |
637 ngx_http_geoip_create_conf(ngx_conf_t *cf) | |
638 { | |
639 ngx_pool_cleanup_t *cln; | |
640 ngx_http_geoip_conf_t *conf; | |
641 | |
642 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip_conf_t)); | |
643 if (conf == NULL) { | |
644 return NULL; | |
645 } | |
646 | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
647 conf->proxy_recursive = NGX_CONF_UNSET; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
648 |
2985 | 649 cln = ngx_pool_cleanup_add(cf->pool, 0); |
650 if (cln == NULL) { | |
651 return NULL; | |
652 } | |
653 | |
654 cln->handler = ngx_http_geoip_cleanup; | |
655 cln->data = conf; | |
656 | |
657 return conf; | |
658 } | |
659 | |
660 | |
661 static char * | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
662 ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf) |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
663 { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
664 ngx_http_geoip_conf_t *gcf = conf; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
665 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
666 ngx_conf_init_value(gcf->proxy_recursive, 0); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
667 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
668 return NGX_CONF_OK; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
669 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
670 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
671 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
672 static char * |
2985 | 673 ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
674 { | |
675 ngx_http_geoip_conf_t *gcf = conf; | |
676 | |
677 ngx_str_t *value; | |
678 | |
679 if (gcf->country) { | |
680 return "is duplicate"; | |
681 } | |
682 | |
683 value = cf->args->elts; | |
684 | |
685 gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); | |
686 | |
687 if (gcf->country == NULL) { | |
688 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3914 | 689 "GeoIP_open(\"%V\") failed", &value[1]); |
2985 | 690 |
691 return NGX_CONF_ERROR; | |
692 } | |
693 | |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
694 if (cf->args->nelts == 3) { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
695 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
|
696 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
|
697 |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
698 } else { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
699 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
|
700 "invalid parameter \"%V\"", &value[2]); |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
701 return NGX_CONF_ERROR; |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
702 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
703 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
704 |
2985 | 705 switch (gcf->country->databaseType) { |
706 | |
707 case GEOIP_COUNTRY_EDITION: | |
708 | |
709 return NGX_CONF_OK; | |
710 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
711 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
712 case GEOIP_COUNTRY_EDITION_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
713 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
714 gcf->country_v6 = 1; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
715 return NGX_CONF_OK; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
716 #endif |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
717 |
2985 | 718 default: |
719 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
720 "invalid GeoIP database \"%V\" type:%d", | |
721 &value[1], gcf->country->databaseType); | |
722 return NGX_CONF_ERROR; | |
723 } | |
724 } | |
725 | |
726 | |
727 static char * | |
3915 | 728 ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
729 { | |
730 ngx_http_geoip_conf_t *gcf = conf; | |
731 | |
732 ngx_str_t *value; | |
733 | |
734 if (gcf->org) { | |
735 return "is duplicate"; | |
736 } | |
737 | |
738 value = cf->args->elts; | |
739 | |
740 gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); | |
741 | |
742 if (gcf->org == NULL) { | |
743 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
744 "GeoIP_open(\"%V\") failed", &value[1]); | |
745 | |
746 return NGX_CONF_ERROR; | |
747 } | |
748 | |
749 if (cf->args->nelts == 3) { | |
750 if (ngx_strcmp(value[2].data, "utf8") == 0) { | |
751 GeoIP_set_charset (gcf->org, GEOIP_CHARSET_UTF8); | |
752 | |
753 } else { | |
754 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
755 "invalid parameter \"%V\"", &value[2]); | |
756 return NGX_CONF_ERROR; | |
757 } | |
758 } | |
759 | |
760 switch (gcf->org->databaseType) { | |
761 | |
762 case GEOIP_ISP_EDITION: | |
763 case GEOIP_ORG_EDITION: | |
764 case GEOIP_DOMAIN_EDITION: | |
765 case GEOIP_ASNUM_EDITION: | |
766 | |
767 return NGX_CONF_OK; | |
768 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
769 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
770 case GEOIP_ISP_EDITION_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
771 case GEOIP_ORG_EDITION_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
772 case GEOIP_DOMAIN_EDITION_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
773 case GEOIP_ASNUM_EDITION_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
774 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
775 gcf->org_v6 = 1; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
776 return NGX_CONF_OK; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
777 #endif |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
778 |
3915 | 779 default: |
780 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
781 "invalid GeoIP database \"%V\" type:%d", | |
782 &value[1], gcf->org->databaseType); | |
783 return NGX_CONF_ERROR; | |
784 } | |
785 } | |
786 | |
787 | |
788 static char * | |
2985 | 789 ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
790 { | |
791 ngx_http_geoip_conf_t *gcf = conf; | |
792 | |
793 ngx_str_t *value; | |
794 | |
795 if (gcf->city) { | |
796 return "is duplicate"; | |
797 } | |
798 | |
799 value = cf->args->elts; | |
800 | |
801 gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); | |
802 | |
803 if (gcf->city == NULL) { | |
804 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3914 | 805 "GeoIP_open(\"%V\") failed", &value[1]); |
2985 | 806 |
807 return NGX_CONF_ERROR; | |
808 } | |
809 | |
3859
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
810 if (cf->args->nelts == 3) { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
811 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
|
812 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
|
813 |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
814 } else { |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
815 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
|
816 "invalid parameter \"%V\"", &value[2]); |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
817 return NGX_CONF_ERROR; |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
818 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
819 } |
30d4d6187316
utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents:
3742
diff
changeset
|
820 |
2985 | 821 switch (gcf->city->databaseType) { |
822 | |
823 case GEOIP_CITY_EDITION_REV0: | |
824 case GEOIP_CITY_EDITION_REV1: | |
825 | |
826 return NGX_CONF_OK; | |
827 | |
5061
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
828 #if (NGX_HAVE_GEOIP_V6) |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
829 case GEOIP_CITY_EDITION_REV0_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
830 case GEOIP_CITY_EDITION_REV1_V6: |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
831 |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
832 gcf->city_v6 = 1; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
833 return NGX_CONF_OK; |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
834 #endif |
7ce4ecb6df5c
Merge of r5014, r5015, r5016, r5030: geoip ipv6 support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4857
diff
changeset
|
835 |
2985 | 836 default: |
837 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
838 "invalid GeoIP City database \"%V\" type:%d", | |
839 &value[1], gcf->city->databaseType); | |
840 return NGX_CONF_ERROR; | |
841 } | |
842 } | |
843 | |
844 | |
4668
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
845 static char * |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
846 ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
847 { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
848 ngx_http_geoip_conf_t *gcf = conf; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
849 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
850 ngx_str_t *value; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
851 ngx_cidr_t cidr, *c; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
852 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
853 value = cf->args->elts; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
854 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
855 if (ngx_http_geoip_cidr_value(cf, &value[1], &cidr) != NGX_OK) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
856 return NGX_CONF_ERROR; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
857 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
858 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
859 if (gcf->proxies == NULL) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
860 gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t)); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
861 if (gcf->proxies == NULL) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
862 return NGX_CONF_ERROR; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
863 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
864 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
865 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
866 c = ngx_array_push(gcf->proxies); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
867 if (c == NULL) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
868 return NGX_CONF_ERROR; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
869 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
870 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
871 *c = cidr; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
872 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
873 return NGX_CONF_OK; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
874 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
875 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
876 static ngx_int_t |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
877 ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
878 { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
879 ngx_int_t rc; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
880 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
881 if (ngx_strcmp(net->data, "255.255.255.255") == 0) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
882 cidr->family = AF_INET; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
883 cidr->u.in.addr = 0xffffffff; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
884 cidr->u.in.mask = 0xffffffff; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
885 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
886 return NGX_OK; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
887 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
888 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
889 rc = ngx_ptocidr(net, cidr); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
890 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
891 if (rc == NGX_ERROR) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
892 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
893 return NGX_ERROR; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
894 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
895 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
896 if (rc == NGX_DONE) { |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
897 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
898 "low address bits of %V are meaningless", net); |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
899 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
900 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
901 return NGX_OK; |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
902 } |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
903 |
ba2c7463ce18
Merge of r4614, r4624-r4629, r4631: proxy recursive changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
904 |
2985 | 905 static void |
906 ngx_http_geoip_cleanup(void *data) | |
907 { | |
908 ngx_http_geoip_conf_t *gcf = data; | |
909 | |
910 if (gcf->country) { | |
911 GeoIP_delete(gcf->country); | |
912 } | |
913 | |
3915 | 914 if (gcf->org) { |
915 GeoIP_delete(gcf->org); | |
916 } | |
917 | |
2985 | 918 if (gcf->city) { |
919 GeoIP_delete(gcf->city); | |
920 } | |
921 } |