30
30
ngx_http_variable_value_t *v, uintptr_t data);
31
31
static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,
32
32
ngx_http_variable_value_t *v, uintptr_t data);
33
static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
34
ngx_http_variable_value_t *v, uintptr_t data);
35
static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);
34
37
static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
35
38
static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
94
97
static ngx_http_variable_t ngx_http_geoip_vars[] = {
96
{ ngx_string("geoip_country_code"), NULL, ngx_http_geoip_country_variable,
99
{ ngx_string("geoip_country_code"), NULL,
100
ngx_http_geoip_country_variable,
97
101
(uintptr_t) GeoIP_country_code_by_ipnum, 0, 0 },
99
{ ngx_string("geoip_country_code3"), NULL, ngx_http_geoip_country_variable,
103
{ ngx_string("geoip_country_code3"), NULL,
104
ngx_http_geoip_country_variable,
100
105
(uintptr_t) GeoIP_country_code3_by_ipnum, 0, 0 },
102
{ ngx_string("geoip_country_name"), NULL, ngx_http_geoip_country_variable,
107
{ ngx_string("geoip_country_name"), NULL,
108
ngx_http_geoip_country_variable,
103
109
(uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 },
105
{ ngx_string("geoip_city_country_code"), NULL, ngx_http_geoip_city_variable,
111
{ ngx_string("geoip_city_continent_code"), NULL,
112
ngx_http_geoip_city_variable,
113
offsetof(GeoIPRecord, continent_code), 0, 0 },
115
{ ngx_string("geoip_city_country_code"), NULL,
116
ngx_http_geoip_city_variable,
106
117
offsetof(GeoIPRecord, country_code), 0, 0 },
108
119
{ ngx_string("geoip_city_country_code3"), NULL,
109
120
ngx_http_geoip_city_variable,
110
121
offsetof(GeoIPRecord, country_code3), 0, 0 },
112
{ ngx_string("geoip_city_country_name"), NULL, ngx_http_geoip_city_variable,
123
{ ngx_string("geoip_city_country_name"), NULL,
124
ngx_http_geoip_city_variable,
113
125
offsetof(GeoIPRecord, country_name), 0, 0 },
115
127
{ ngx_string("geoip_region"), NULL,
124
136
ngx_http_geoip_city_variable,
125
137
offsetof(GeoIPRecord, postal_code), 0, 0 },
139
{ ngx_string("geoip_latitude"), NULL,
140
ngx_http_geoip_city_float_variable,
141
offsetof(GeoIPRecord, latitude), 0, 0 },
143
{ ngx_string("geoip_longitude"), NULL,
144
ngx_http_geoip_city_float_variable,
145
offsetof(GeoIPRecord, longitude), 0, 0 },
127
147
{ ngx_null_string, NULL, NULL, 0, 0, 0 }
179
199
ngx_http_geoip_city_variable(ngx_http_request_t *r,
180
200
ngx_http_variable_value_t *v, uintptr_t data)
186
struct sockaddr_in *sin;
187
ngx_http_geoip_conf_t *gcf;
189
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
191
if (gcf->city == NULL) {
195
if (r->connection->sockaddr->sa_family != AF_INET) {
199
sin = (struct sockaddr_in *) r->connection->sockaddr;
200
addr = ntohl(sin->sin_addr.s_addr);
202
gr = GeoIP_record_by_ipnum(gcf->city, addr);
206
gr = ngx_http_geoip_get_city_record(r);
204
207
if (gr == NULL) {
208
211
val = *(char **) ((char *) gr + data);
210
212
if (val == NULL) {
248
ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
249
ngx_http_variable_value_t *v, uintptr_t data)
254
gr = ngx_http_geoip_get_city_record(r);
260
v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5);
261
if (v->data == NULL) {
262
GeoIPRecord_delete(gr);
266
val = *(float *) ((char *) gr + data);
268
v->len = ngx_sprintf(v->data, "%.4f", val) - v->data;
270
GeoIPRecord_delete(gr);
277
ngx_http_geoip_get_city_record(ngx_http_request_t *r)
280
struct sockaddr_in *sin;
281
ngx_http_geoip_conf_t *gcf;
283
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
285
if (gcf->city && r->connection->sockaddr->sa_family == AF_INET) {
287
sin = (struct sockaddr_in *) r->connection->sockaddr;
288
addr = ntohl(sin->sin_addr.s_addr);
290
return GeoIP_record_by_ipnum(gcf->city, addr);
246
298
ngx_http_geoip_add_variables(ngx_conf_t *cf)
248
300
ngx_http_variable_t *var, *v;