annotate src/http/modules/ngx_http_geoip_module.c @ 4034:e2c075e774b6

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