annotate src/http/modules/ngx_http_geoip_module.c @ 4458:2d4ff8bd5649

Limit conn: returned to the old behavior of using the first actual limit on the way. It was unintentionally changed in r4272, so that it could only limit the first location where the processing of the request has reached PREACCESS phase.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 10 Feb 2012 10:48:58 +0000
parents d620f497c50f
children 3152e4c371d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3919
diff changeset
4 * Copyright (C) Nginx, Inc.
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 #include <GeoIP.h>
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 #include <GeoIPCity.h>
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 typedef struct {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 GeoIP *country;
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
18 GeoIP *org;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 GeoIP *city;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 } ngx_http_geoip_conf_t;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 typedef struct {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 ngx_str_t *name;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 uintptr_t data;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 } ngx_http_geoip_var_t;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, u_long addr);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_http_variable_value_t *v, uintptr_t data);
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
33 static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
34 ngx_http_variable_value_t *v, uintptr_t data);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 ngx_http_variable_value_t *v, uintptr_t data);
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
37 static ngx_int_t ngx_http_geoip_region_name_variable(ngx_http_request_t *r,
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
38 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
39 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
40 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
41 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
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 GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 void *conf);
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
49 static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
50 void *conf);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 void *conf);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 static void ngx_http_geoip_cleanup(void *data);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 static ngx_command_t ngx_http_geoip_commands[] = {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 { ngx_string("geoip_country"),
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
59 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ngx_http_geoip_country,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 NGX_HTTP_MAIN_CONF_OFFSET,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 NULL },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
65 { ngx_string("geoip_org"),
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
66 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
67 ngx_http_geoip_org,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
68 NGX_HTTP_MAIN_CONF_OFFSET,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
69 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
70 NULL },
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
71
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 { ngx_string("geoip_city"),
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
73 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_http_geoip_city,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 NGX_HTTP_MAIN_CONF_OFFSET,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 NULL },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_null_command
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 static ngx_http_module_t ngx_http_geoip_module_ctx = {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_http_geoip_add_variables, /* preconfiguration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 NULL, /* postconfiguration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 ngx_http_geoip_create_conf, /* create main configuration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 NULL, /* init main configuration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 NULL, /* create server configuration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 NULL, /* merge server configuration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 NULL, /* create location configuration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 NULL /* merge location configuration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_module_t ngx_http_geoip_module = {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NGX_MODULE_V1,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 &ngx_http_geoip_module_ctx, /* module context */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 ngx_http_geoip_commands, /* module directives */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 NGX_HTTP_MODULE, /* module type */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* init master */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 NULL, /* init module */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 NULL, /* init process */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 NULL, /* init thread */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 NULL, /* exit thread */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 NULL, /* exit process */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 NULL, /* exit master */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 NGX_MODULE_V1_PADDING
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 static ngx_http_variable_t ngx_http_geoip_vars[] = {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
116 { ngx_string("geoip_country_code"), NULL,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
117 ngx_http_geoip_country_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 (uintptr_t) GeoIP_country_code_by_ipnum, 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
120 { ngx_string("geoip_country_code3"), NULL,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
121 ngx_http_geoip_country_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 (uintptr_t) GeoIP_country_code3_by_ipnum, 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
124 { ngx_string("geoip_country_name"), NULL,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
125 ngx_http_geoip_country_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 (uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
128 { ngx_string("geoip_org"), NULL,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
129 ngx_http_geoip_org_variable,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
130 (uintptr_t) GeoIP_name_by_ipnum, 0, 0 },
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
131
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
132 { 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
133 ngx_http_geoip_city_variable,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
134 offsetof(GeoIPRecord, continent_code), 0, 0 },
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
135
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
136 { 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
137 ngx_http_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 offsetof(GeoIPRecord, country_code), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 { ngx_string("geoip_city_country_code3"), NULL,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 ngx_http_geoip_city_variable,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 offsetof(GeoIPRecord, country_code3), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
144 { 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
145 ngx_http_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 offsetof(GeoIPRecord, country_name), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 { ngx_string("geoip_region"), NULL,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 ngx_http_geoip_city_variable,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 offsetof(GeoIPRecord, region), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
152 { ngx_string("geoip_region_name"), NULL,
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
153 ngx_http_geoip_region_name_variable,
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
154 0, 0, 0 },
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
155
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 { ngx_string("geoip_city"), NULL,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 ngx_http_geoip_city_variable,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 offsetof(GeoIPRecord, city), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 { ngx_string("geoip_postal_code"), NULL,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ngx_http_geoip_city_variable,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 offsetof(GeoIPRecord, postal_code), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
164 { ngx_string("geoip_latitude"), NULL,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
165 ngx_http_geoip_city_float_variable,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
166 offsetof(GeoIPRecord, latitude), 0, 0 },
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
167
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
168 { ngx_string("geoip_longitude"), NULL,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
169 ngx_http_geoip_city_float_variable,
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
170 offsetof(GeoIPRecord, longitude), 0, 0 },
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
171
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
172 { ngx_string("geoip_dma_code"), NULL,
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
173 ngx_http_geoip_city_int_variable,
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
174 offsetof(GeoIPRecord, dma_code), 0, 0 },
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
175
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
176 { ngx_string("geoip_area_code"), NULL,
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
177 ngx_http_geoip_city_int_variable,
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
178 offsetof(GeoIPRecord, area_code), 0, 0 },
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
179
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 { ngx_null_string, NULL, NULL, 0, 0, 0 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
184 static u_long
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
185 ngx_http_geoip_addr(ngx_http_request_t *r)
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
186 {
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
187 struct sockaddr_in *sin;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
188 #if (NGX_HAVE_INET6)
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
189 u_char *p;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
190 u_long addr;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
191 struct sockaddr_in6 *sin6;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
192 #endif
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
193
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
194 switch (r->connection->sockaddr->sa_family) {
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
195
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
196 case AF_INET:
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
197 sin = (struct sockaddr_in *) r->connection->sockaddr;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
198 return ntohl(sin->sin_addr.s_addr);
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
199
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
200 #if (NGX_HAVE_INET6)
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
201
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
202 case AF_INET6:
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
203 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
204
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
205 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
206 p = sin6->sin6_addr.s6_addr;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
207 addr = p[12] << 24;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
208 addr += p[13] << 16;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
209 addr += p[14] << 8;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
210 addr += p[15];
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
211
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
212 return addr;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
213 }
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
214
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
215 #endif
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
216 }
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
217
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
218 return INADDR_NONE;
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
219 }
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
220
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
221
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 static ngx_int_t
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 ngx_http_geoip_country_variable(ngx_http_request_t *r,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 ngx_http_variable_value_t *v, uintptr_t data)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 ngx_http_geoip_variable_handler_pt handler =
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 (ngx_http_geoip_variable_handler_pt) data;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 const char *val;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 ngx_http_geoip_conf_t *gcf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 if (gcf->country == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 goto not_found;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
238 val = handler(gcf->country, ngx_http_geoip_addr(r));
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 if (val == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 goto not_found;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 v->len = ngx_strlen(val);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 v->valid = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 v->no_cacheable = 0;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 v->not_found = 0;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 v->data = (u_char *) val;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 not_found:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 v->not_found = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 static ngx_int_t
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
261 ngx_http_geoip_org_variable(ngx_http_request_t *r,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
262 ngx_http_variable_value_t *v, uintptr_t data)
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
263 {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
264 ngx_http_geoip_variable_handler_pt handler =
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
265 (ngx_http_geoip_variable_handler_pt) data;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
266
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
267 const char *val;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
268 ngx_http_geoip_conf_t *gcf;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
269
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
270 gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
271
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
272 if (gcf->org == NULL) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
273 goto not_found;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
274 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
275
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
276 val = handler(gcf->org, ngx_http_geoip_addr(r));
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
277
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
278 if (val == NULL) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
279 goto not_found;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
280 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
281
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
282 v->len = ngx_strlen(val);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
283 v->valid = 1;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
284 v->no_cacheable = 0;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
285 v->not_found = 0;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
286 v->data = (u_char *) val;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
287
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
288 return NGX_OK;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
289
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
290 not_found:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
291
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
292 v->not_found = 1;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
293
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
294 return NGX_OK;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
295 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
296
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
297
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
298 static ngx_int_t
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 ngx_http_geoip_city_variable(ngx_http_request_t *r,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 ngx_http_variable_value_t *v, uintptr_t data)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301 {
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
302 char *val;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
303 size_t len;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
304 GeoIPRecord *gr;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
306 gr = ngx_http_geoip_get_city_record(r);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 if (gr == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 goto not_found;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 val = *(char **) ((char *) gr + data);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 if (val == NULL) {
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
313 goto no_value;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
316 len = ngx_strlen(val);
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
317 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
318 if (v->data == NULL) {
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
319 GeoIPRecord_delete(gr);
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
320 return NGX_ERROR;
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
321 }
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
322
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
323 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
324
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
325 v->len = len;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 v->valid = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 v->no_cacheable = 0;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 v->not_found = 0;
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
329
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
330 GeoIPRecord_delete(gr);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
334 no_value:
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
335
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
336 GeoIPRecord_delete(gr);
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
337
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 not_found:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
340 v->not_found = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346 static ngx_int_t
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
347 ngx_http_geoip_region_name_variable(ngx_http_request_t *r,
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
348 ngx_http_variable_value_t *v, uintptr_t data)
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
349 {
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
350 size_t len;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
351 const char *val;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
352 GeoIPRecord *gr;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
353
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
354 gr = ngx_http_geoip_get_city_record(r);
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
355 if (gr == NULL) {
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
356 goto not_found;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
357 }
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
358
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
359 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
360
01691af60f94 we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents: 3741
diff changeset
361 GeoIPRecord_delete(gr);
01691af60f94 we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents: 3741
diff changeset
362
3741
0f9b2d285bfc fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents: 3737
diff changeset
363 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
364 goto not_found;
3741
0f9b2d285bfc fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents: 3737
diff changeset
365 }
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
366
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
367 len = ngx_strlen(val);
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
368 v->data = ngx_pnalloc(r->pool, len);
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
369 if (v->data == NULL) {
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
370 return NGX_ERROR;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
371 }
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
372
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
373 ngx_memcpy(v->data, val, len);
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
374
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
375 v->len = len;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
376 v->valid = 1;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
377 v->no_cacheable = 0;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
378 v->not_found = 0;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
379
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
380 return NGX_OK;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
381
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
382 not_found:
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
383
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
384 v->not_found = 1;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
385
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
386 return NGX_OK;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
387 }
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
388
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
389
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
390 static ngx_int_t
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
391 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
392 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
393 {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
394 float val;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
395 GeoIPRecord *gr;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
396
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
397 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
398 if (gr == NULL) {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
399 v->not_found = 1;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
400 return NGX_OK;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
401 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
402
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
403 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
404 if (v->data == NULL) {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
405 GeoIPRecord_delete(gr);
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
406 return NGX_ERROR;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
407 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
408
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
409 val = *(float *) ((char *) gr + data);
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
410
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
411 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
412
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
413 GeoIPRecord_delete(gr);
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
414
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
415 return NGX_OK;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
416 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
417
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
418
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
419 static ngx_int_t
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
420 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
421 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
422 {
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
423 int val;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
424 GeoIPRecord *gr;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
425
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
426 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
427 if (gr == NULL) {
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
428 v->not_found = 1;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
429 return NGX_OK;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
430 }
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
431
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
432 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
433 if (v->data == NULL) {
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
434 GeoIPRecord_delete(gr);
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
435 return NGX_ERROR;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
436 }
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
437
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
438 val = *(int *) ((char *) gr + data);
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
439
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
440 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
441
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
442 GeoIPRecord_delete(gr);
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
443
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
444 return NGX_OK;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
445 }
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
446
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
447
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
448 static GeoIPRecord *
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
449 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
450 {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
451 ngx_http_geoip_conf_t *gcf;
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 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
454
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
455 if (gcf->city) {
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
456 return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r));
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
457 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
458
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
459 return NULL;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
460 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
461
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
462
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
463 static ngx_int_t
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 ngx_http_geoip_add_variables(ngx_conf_t *cf)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 ngx_http_variable_t *var, *v;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 for (v = ngx_http_geoip_vars; v->name.len; v++) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 var = ngx_http_add_variable(cf, &v->name, v->flags);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 if (var == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 return NGX_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 var->get_handler = v->get_handler;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 var->data = v->data;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 static void *
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 ngx_http_geoip_create_conf(ngx_conf_t *cf)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 ngx_pool_cleanup_t *cln;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486 ngx_http_geoip_conf_t *conf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip_conf_t));
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 if (conf == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 return NULL;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 cln = ngx_pool_cleanup_add(cf->pool, 0);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 if (cln == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 return NULL;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 cln->handler = ngx_http_geoip_cleanup;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 cln->data = conf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 return conf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 static char *
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507 {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508 ngx_http_geoip_conf_t *gcf = conf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510 ngx_str_t *value;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 if (gcf->country) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 return "is duplicate";
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 value = cf->args->elts;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518 gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520 if (gcf->country == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3914
2b92090d8a43 fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3859
diff changeset
522 "GeoIP_open(\"%V\") failed", &value[1]);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
527 if (cf->args->nelts == 3) {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
528 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
529 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
530
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
531 } else {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
532 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
533 "invalid parameter \"%V\"", &value[2]);
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
534 return NGX_CONF_ERROR;
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
535 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
536 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
537
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 switch (gcf->country->databaseType) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 case GEOIP_COUNTRY_EDITION:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 case GEOIP_PROXY_EDITION:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 case GEOIP_NETSPEED_EDITION:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 return NGX_CONF_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546 default:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548 "invalid GeoIP database \"%V\" type:%d",
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 &value[1], gcf->country->databaseType);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 static char *
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
556 ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
557 {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
558 ngx_http_geoip_conf_t *gcf = conf;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
559
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
560 ngx_str_t *value;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
561
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
562 if (gcf->org) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
563 return "is duplicate";
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
564 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
565
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
566 value = cf->args->elts;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
567
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
568 gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
569
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
570 if (gcf->org == NULL) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
571 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
572 "GeoIP_open(\"%V\") failed", &value[1]);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
573
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
574 return NGX_CONF_ERROR;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
575 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
576
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
577 if (cf->args->nelts == 3) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
578 if (ngx_strcmp(value[2].data, "utf8") == 0) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
579 GeoIP_set_charset (gcf->org, GEOIP_CHARSET_UTF8);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
580
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
581 } else {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
582 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
583 "invalid parameter \"%V\"", &value[2]);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
584 return NGX_CONF_ERROR;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
585 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
586 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
587
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
588 switch (gcf->org->databaseType) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
589
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
590 case GEOIP_ISP_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
591 case GEOIP_ORG_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
592 case GEOIP_DOMAIN_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
593 case GEOIP_ASNUM_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
594
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
595 return NGX_CONF_OK;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
596
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
597 default:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
598 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
599 "invalid GeoIP database \"%V\" type:%d",
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
600 &value[1], gcf->org->databaseType);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
601 return NGX_CONF_ERROR;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
602 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
603 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
604
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
605
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
606 static char *
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607 ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 ngx_http_geoip_conf_t *gcf = conf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 ngx_str_t *value;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 if (gcf->city) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 return "is duplicate";
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617 value = cf->args->elts;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621 if (gcf->city == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3914
2b92090d8a43 fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3859
diff changeset
623 "GeoIP_open(\"%V\") failed", &value[1]);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
628 if (cf->args->nelts == 3) {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
629 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
630 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
631
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
632 } else {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
633 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
634 "invalid parameter \"%V\"", &value[2]);
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
635 return NGX_CONF_ERROR;
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
636 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
637 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
638
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639 switch (gcf->city->databaseType) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641 case GEOIP_CITY_EDITION_REV0:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 case GEOIP_CITY_EDITION_REV1:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644 return NGX_CONF_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 default:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 "invalid GeoIP City database \"%V\" type:%d",
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 &value[1], gcf->city->databaseType);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 static void
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 ngx_http_geoip_cleanup(void *data)
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 ngx_http_geoip_conf_t *gcf = data;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 if (gcf->country) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 GeoIP_delete(gcf->country);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
664 if (gcf->org) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
665 GeoIP_delete(gcf->org);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
666 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
667
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 if (gcf->city) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669 GeoIP_delete(gcf->city);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671 }