annotate src/stream/ngx_stream_geoip_module.c @ 7682:2ab0ecfe5a5f

release-1.19.1 tag
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 07 Jul 2020 18:56:06 +0300
parents 2a288909abc6
children
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>
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
10 #include <ngx_stream.h>
2985
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
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
16 #define NGX_GEOIP_COUNTRY_CODE 0
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
17 #define NGX_GEOIP_COUNTRY_CODE3 1
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
18 #define NGX_GEOIP_COUNTRY_NAME 2
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
19
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
20
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 typedef struct {
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
22 GeoIP *country;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
23 GeoIP *org;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
24 GeoIP *city;
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
25 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
26 unsigned country_v6:1;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
27 unsigned org_v6:1;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
28 unsigned city_v6:1;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
29 #endif
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
30 } ngx_stream_geoip_conf_t;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 typedef struct {
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
34 ngx_str_t *name;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
35 uintptr_t data;
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
36 } ngx_stream_geoip_var_t;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
39 typedef const char *(*ngx_stream_geoip_variable_handler_pt)(GeoIP *,
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
40 u_long addr);
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
41
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
42
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
43 ngx_stream_geoip_variable_handler_pt ngx_stream_geoip_country_functions[] = {
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
44 GeoIP_country_code_by_ipnum,
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
45 GeoIP_country_code3_by_ipnum,
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
46 GeoIP_country_name_by_ipnum,
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
47 };
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
48
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
49
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
50 #if (NGX_HAVE_GEOIP_V6)
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
52 typedef const char *(*ngx_stream_geoip_variable_handler_v6_pt)(GeoIP *,
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
53 geoipv6_t addr);
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
54
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
55
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
56 ngx_stream_geoip_variable_handler_v6_pt
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
57 ngx_stream_geoip_country_v6_functions[] =
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
58 {
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
59 GeoIP_country_code_by_ipnum_v6,
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
60 GeoIP_country_code3_by_ipnum_v6,
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
61 GeoIP_country_name_by_ipnum_v6,
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
62 };
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
63
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
64 #endif
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
65
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
66
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
67 static ngx_int_t ngx_stream_geoip_country_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
68 ngx_stream_variable_value_t *v, uintptr_t data);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
69 static ngx_int_t ngx_stream_geoip_org_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
70 ngx_stream_variable_value_t *v, uintptr_t data);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
71 static ngx_int_t ngx_stream_geoip_city_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
72 ngx_stream_variable_value_t *v, uintptr_t data);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
73 static ngx_int_t ngx_stream_geoip_region_name_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
74 ngx_stream_variable_value_t *v, uintptr_t data);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
75 static ngx_int_t ngx_stream_geoip_city_float_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
76 ngx_stream_variable_value_t *v, uintptr_t data);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
77 static ngx_int_t ngx_stream_geoip_city_int_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
78 ngx_stream_variable_value_t *v, uintptr_t data);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
79 static GeoIPRecord *ngx_stream_geoip_get_city_record(ngx_stream_session_t *s);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
81 static ngx_int_t ngx_stream_geoip_add_variables(ngx_conf_t *cf);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
82 static void *ngx_stream_geoip_create_conf(ngx_conf_t *cf);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
83 static char *ngx_stream_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd,
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
84 void *conf);
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
85 static char *ngx_stream_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd,
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
86 void *conf);
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
87 static char *ngx_stream_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
88 void *conf);
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
89 static void ngx_stream_geoip_cleanup(void *data);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
92 static ngx_command_t ngx_stream_geoip_commands[] = {
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 { ngx_string("geoip_country"),
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
95 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE12,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
96 ngx_stream_geoip_country,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
97 NGX_STREAM_MAIN_CONF_OFFSET,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NULL },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
101 { ngx_string("geoip_org"),
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
102 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE12,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
103 ngx_stream_geoip_org,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
104 NGX_STREAM_MAIN_CONF_OFFSET,
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
105 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
106 NULL },
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
107
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 { ngx_string("geoip_city"),
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
109 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE12,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
110 ngx_stream_geoip_city,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
111 NGX_STREAM_MAIN_CONF_OFFSET,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 NULL },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 ngx_null_command
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
119 static ngx_stream_module_t ngx_stream_geoip_module_ctx = {
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
120 ngx_stream_geoip_add_variables, /* preconfiguration */
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 NULL, /* postconfiguration */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
123 ngx_stream_geoip_create_conf, /* create main configuration */
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
124 NULL, /* init main configuration */
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 NULL, /* create server configuration */
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
127 NULL /* merge server configuration */
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
131 ngx_module_t ngx_stream_geoip_module = {
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 NGX_MODULE_V1,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
133 &ngx_stream_geoip_module_ctx, /* module context */
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
134 ngx_stream_geoip_commands, /* module directives */
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
135 NGX_STREAM_MODULE, /* module type */
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NULL, /* init master */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL, /* init module */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 NULL, /* init process */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 NULL, /* init thread */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 NULL, /* exit thread */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 NULL, /* exit process */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 NULL, /* exit master */
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 NGX_MODULE_V1_PADDING
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
147 static ngx_stream_variable_t ngx_stream_geoip_vars[] = {
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
149 { ngx_string("geoip_country_code"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
150 ngx_stream_geoip_country_variable,
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
151 NGX_GEOIP_COUNTRY_CODE, 0, 0 },
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
153 { ngx_string("geoip_country_code3"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
154 ngx_stream_geoip_country_variable,
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
155 NGX_GEOIP_COUNTRY_CODE3, 0, 0 },
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
157 { ngx_string("geoip_country_name"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
158 ngx_stream_geoip_country_variable,
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
159 NGX_GEOIP_COUNTRY_NAME, 0, 0 },
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
161 { ngx_string("geoip_org"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
162 ngx_stream_geoip_org_variable,
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
163 0, 0, 0 },
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
164
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
165 { ngx_string("geoip_city_continent_code"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
166 ngx_stream_geoip_city_variable,
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
167 offsetof(GeoIPRecord, continent_code), 0, 0 },
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
168
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
169 { ngx_string("geoip_city_country_code"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
170 ngx_stream_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 offsetof(GeoIPRecord, country_code), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 { ngx_string("geoip_city_country_code3"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
174 ngx_stream_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 offsetof(GeoIPRecord, country_code3), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
177 { ngx_string("geoip_city_country_name"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
178 ngx_stream_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 offsetof(GeoIPRecord, country_name), 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 { ngx_string("geoip_region"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
182 ngx_stream_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 offsetof(GeoIPRecord, region), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
185 { ngx_string("geoip_region_name"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
186 ngx_stream_geoip_region_name_variable,
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
187 0, 0, 0 },
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
188
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 { ngx_string("geoip_city"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
190 ngx_stream_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 offsetof(GeoIPRecord, city), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 { ngx_string("geoip_postal_code"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
194 ngx_stream_geoip_city_variable,
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 offsetof(GeoIPRecord, postal_code), 0, 0 },
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
197 { ngx_string("geoip_latitude"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
198 ngx_stream_geoip_city_float_variable,
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
199 offsetof(GeoIPRecord, latitude), 0, 0 },
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
200
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
201 { ngx_string("geoip_longitude"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
202 ngx_stream_geoip_city_float_variable,
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
203 offsetof(GeoIPRecord, longitude), 0, 0 },
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
204
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
205 { ngx_string("geoip_dma_code"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
206 ngx_stream_geoip_city_int_variable,
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
207 offsetof(GeoIPRecord, dma_code), 0, 0 },
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
208
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
209 { ngx_string("geoip_area_code"), NULL,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
210 ngx_stream_geoip_city_int_variable,
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
211 offsetof(GeoIPRecord, area_code), 0, 0 },
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
212
7077
2a288909abc6 Variables: macros for null variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6630
diff changeset
213 ngx_stream_null_variable
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 };
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
217 static u_long
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
218 ngx_stream_geoip_addr(ngx_stream_session_t *s, ngx_stream_geoip_conf_t *gcf)
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
219 {
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
220 ngx_addr_t addr;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
221 struct sockaddr_in *sin;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
222
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
223 addr.sockaddr = s->connection->sockaddr;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
224 addr.socklen = s->connection->socklen;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
225 /* addr.name = s->connection->addr_text; */
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
226
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
227 #if (NGX_HAVE_INET6)
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
228
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
229 if (addr.sockaddr->sa_family == AF_INET6) {
4828
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
230 u_char *p;
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
231 in_addr_t inaddr;
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
232 struct in6_addr *inaddr6;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
233
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
234 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
235
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
236 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
4828
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
237 p = inaddr6->s6_addr;
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
238
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
239 inaddr = p[12] << 24;
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
240 inaddr += p[13] << 16;
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
241 inaddr += p[14] << 8;
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
242 inaddr += p[15];
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
243
f57154322e0e Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
Ruslan Ermilov <ru@nginx.com>
parents: 4649
diff changeset
244 return inaddr;
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
245 }
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
246 }
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
247
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
248 #endif
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
249
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
250 if (addr.sockaddr->sa_family != AF_INET) {
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
251 return INADDR_NONE;
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
252 }
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
253
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
254 sin = (struct sockaddr_in *) addr.sockaddr;
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
255 return ntohl(sin->sin_addr.s_addr);
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
256 }
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
257
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
258
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
259 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
260
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
261 static geoipv6_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
262 ngx_stream_geoip_addr_v6(ngx_stream_session_t *s, ngx_stream_geoip_conf_t *gcf)
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
263 {
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
264 ngx_addr_t addr;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
265 in_addr_t addr4;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
266 struct in6_addr addr6;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
267 struct sockaddr_in *sin;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
268 struct sockaddr_in6 *sin6;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
269
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
270 addr.sockaddr = s->connection->sockaddr;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
271 addr.socklen = s->connection->socklen;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
272 /* addr.name = s->connection->addr_text; */
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
273
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
274 switch (addr.sockaddr->sa_family) {
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
275
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
276 case AF_INET:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
277 /* Produce IPv4-mapped IPv6 address. */
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
278 sin = (struct sockaddr_in *) addr.sockaddr;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
279 addr4 = ntohl(sin->sin_addr.s_addr);
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
280
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
281 ngx_memzero(&addr6, sizeof(struct in6_addr));
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
282 addr6.s6_addr[10] = 0xff;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
283 addr6.s6_addr[11] = 0xff;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
284 addr6.s6_addr[12] = addr4 >> 24;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
285 addr6.s6_addr[13] = addr4 >> 16;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
286 addr6.s6_addr[14] = addr4 >> 8;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
287 addr6.s6_addr[15] = addr4;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
288 return addr6;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
289
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
290 case AF_INET6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
291 sin6 = (struct sockaddr_in6 *) addr.sockaddr;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
292 return sin6->sin6_addr;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
293
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
294 default:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
295 return in6addr_any;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
296 }
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
297 }
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
298
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
299 #endif
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
300
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
301
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
303 ngx_stream_geoip_country_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
304 ngx_stream_variable_value_t *v, uintptr_t data)
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
306 ngx_stream_geoip_variable_handler_pt handler =
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
307 ngx_stream_geoip_country_functions[data];
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
308 #if (NGX_HAVE_GEOIP_V6)
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
309 ngx_stream_geoip_variable_handler_v6_pt handler_v6 =
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
310 ngx_stream_geoip_country_v6_functions[data];
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
311 #endif
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
313 const char *val;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
314 ngx_stream_geoip_conf_t *gcf;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
316 gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip_module);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 if (gcf->country == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 goto not_found;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
322 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
323 val = gcf->country_v6
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
324 ? handler_v6(gcf->country, ngx_stream_geoip_addr_v6(s, gcf))
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
325 : handler(gcf->country, ngx_stream_geoip_addr(s, gcf));
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
326 #else
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
327 val = handler(gcf->country, ngx_stream_geoip_addr(s, gcf));
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
328 #endif
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 if (val == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 goto not_found;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 v->len = ngx_strlen(val);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335 v->valid = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 v->no_cacheable = 0;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 v->not_found = 0;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 v->data = (u_char *) val;
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 return NGX_OK;
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 not_found:
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 v->not_found = 1;
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 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
351 ngx_stream_geoip_org_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
352 ngx_stream_variable_value_t *v, uintptr_t data)
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
353 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
354 size_t len;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
355 char *val;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
356 ngx_stream_geoip_conf_t *gcf;
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
357
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
358 gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip_module);
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
359
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
360 if (gcf->org == NULL) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
361 goto not_found;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
362 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
363
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
364 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
365 val = gcf->org_v6
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
366 ? GeoIP_name_by_ipnum_v6(gcf->org,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
367 ngx_stream_geoip_addr_v6(s, gcf))
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
368 : GeoIP_name_by_ipnum(gcf->org,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
369 ngx_stream_geoip_addr(s, gcf));
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
370 #else
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
371 val = GeoIP_name_by_ipnum(gcf->org, ngx_stream_geoip_addr(s, gcf));
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
372 #endif
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
373
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
374 if (val == NULL) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
375 goto not_found;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
376 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
377
4647
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
378 len = ngx_strlen(val);
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
379 v->data = ngx_pnalloc(s->connection->pool, len);
4647
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
380 if (v->data == NULL) {
4649
95d93f7e6fa2 geoip: got rid of ugly casts when calling ngx_free().
Ruslan Ermilov <ru@nginx.com>
parents: 4648
diff changeset
381 ngx_free(val);
4647
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
382 return NGX_ERROR;
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
383 }
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
384
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
385 ngx_memcpy(v->data, val, len);
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
386
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
387 v->len = len;
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
388 v->valid = 1;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
389 v->no_cacheable = 0;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
390 v->not_found = 0;
4647
a321eadcb16c Fixed memory leak if $geoip_org variable was used.
Ruslan Ermilov <ru@nginx.com>
parents: 4627
diff changeset
391
4649
95d93f7e6fa2 geoip: got rid of ugly casts when calling ngx_free().
Ruslan Ermilov <ru@nginx.com>
parents: 4648
diff changeset
392 ngx_free(val);
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
393
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
394 return NGX_OK;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
395
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
396 not_found:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
397
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
398 v->not_found = 1;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
399
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
400 return NGX_OK;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
401 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
402
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
403
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
404 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
405 ngx_stream_geoip_city_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
406 ngx_stream_variable_value_t *v, uintptr_t data)
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 {
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
408 char *val;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
409 size_t len;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
410 GeoIPRecord *gr;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
412 gr = ngx_stream_geoip_get_city_record(s);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 if (gr == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 goto not_found;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 val = *(char **) ((char *) gr + data);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418 if (val == NULL) {
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
419 goto no_value;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
422 len = ngx_strlen(val);
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
423 v->data = ngx_pnalloc(s->connection->pool, len);
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
424 if (v->data == NULL) {
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
425 GeoIPRecord_delete(gr);
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
426 return NGX_ERROR;
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
427 }
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
428
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
429 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
430
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
431 v->len = len;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 v->valid = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 v->no_cacheable = 0;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 v->not_found = 0;
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
435
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
436 GeoIPRecord_delete(gr);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439
3031
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
440 no_value:
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
441
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
442 GeoIPRecord_delete(gr);
98a8336c5b7c fix memory leak if GeoIP City database was used
Igor Sysoev <igor@sysoev.ru>
parents: 2985
diff changeset
443
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 not_found:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 v->not_found = 1;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
453 ngx_stream_geoip_region_name_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
454 ngx_stream_variable_value_t *v, uintptr_t data)
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
455 {
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
456 size_t len;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
457 const char *val;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
458 GeoIPRecord *gr;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
459
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
460 gr = ngx_stream_geoip_get_city_record(s);
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
461 if (gr == NULL) {
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
462 goto not_found;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
463 }
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
464
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
465 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
466
01691af60f94 we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents: 3741
diff changeset
467 GeoIPRecord_delete(gr);
01691af60f94 we can free GeoIPRecord just after GeoIP_region_name_by_code(),
Igor Sysoev <igor@sysoev.ru>
parents: 3741
diff changeset
468
3741
0f9b2d285bfc fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents: 3737
diff changeset
469 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
470 goto not_found;
3741
0f9b2d285bfc fix segfault, the bug has been introduced in r3738
Igor Sysoev <igor@sysoev.ru>
parents: 3737
diff changeset
471 }
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
472
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
473 len = ngx_strlen(val);
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
474 v->data = ngx_pnalloc(s->connection->pool, len);
3737
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
475 if (v->data == NULL) {
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
476 return NGX_ERROR;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
477 }
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
478
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
479 ngx_memcpy(v->data, val, len);
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
480
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
481 v->len = len;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
482 v->valid = 1;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
483 v->no_cacheable = 0;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
484 v->not_found = 0;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
485
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
486 return NGX_OK;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
487
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
488 not_found:
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
489
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
490 v->not_found = 1;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
491
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
492 return NGX_OK;
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
493 }
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
494
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
495
18ae5f09a53d $geoip_region_name
Igor Sysoev <igor@sysoev.ru>
parents: 3736
diff changeset
496 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
497 ngx_stream_geoip_city_float_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
498 ngx_stream_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
499 {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
500 float val;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
501 GeoIPRecord *gr;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
502
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
503 gr = ngx_stream_geoip_get_city_record(s);
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
504 if (gr == NULL) {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
505 v->not_found = 1;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
506 return NGX_OK;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
507 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
508
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
509 v->data = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN + 5);
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
510 if (v->data == NULL) {
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
511 GeoIPRecord_delete(gr);
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
512 return NGX_ERROR;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
513 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
514
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
515 val = *(float *) ((char *) gr + data);
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
516
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
517 v->len = ngx_sprintf(v->data, "%.4f", val) - v->data;
5773
494c2c2a0247 GeoIP: not all variable fields were initialized.
Yichun Zhang <agentzh@gmail.com>
parents: 5758
diff changeset
518 v->valid = 1;
494c2c2a0247 GeoIP: not all variable fields were initialized.
Yichun Zhang <agentzh@gmail.com>
parents: 5758
diff changeset
519 v->no_cacheable = 0;
494c2c2a0247 GeoIP: not all variable fields were initialized.
Yichun Zhang <agentzh@gmail.com>
parents: 5758
diff changeset
520 v->not_found = 0;
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
521
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
522 GeoIPRecord_delete(gr);
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
523
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
524 return NGX_OK;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
525 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
526
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
527
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
528 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
529 ngx_stream_geoip_city_int_variable(ngx_stream_session_t *s,
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
530 ngx_stream_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
531 {
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
532 int val;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
533 GeoIPRecord *gr;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
534
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
535 gr = ngx_stream_geoip_get_city_record(s);
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
536 if (gr == NULL) {
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
537 v->not_found = 1;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
538 return NGX_OK;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
539 }
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
540
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
541 v->data = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN);
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
542 if (v->data == NULL) {
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
543 GeoIPRecord_delete(gr);
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
544 return NGX_ERROR;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
545 }
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
546
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
547 val = *(int *) ((char *) gr + data);
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
548
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
549 v->len = ngx_sprintf(v->data, "%d", val) - v->data;
5773
494c2c2a0247 GeoIP: not all variable fields were initialized.
Yichun Zhang <agentzh@gmail.com>
parents: 5758
diff changeset
550 v->valid = 1;
494c2c2a0247 GeoIP: not all variable fields were initialized.
Yichun Zhang <agentzh@gmail.com>
parents: 5758
diff changeset
551 v->no_cacheable = 0;
494c2c2a0247 GeoIP: not all variable fields were initialized.
Yichun Zhang <agentzh@gmail.com>
parents: 5758
diff changeset
552 v->not_found = 0;
3736
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
553
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
554 GeoIPRecord_delete(gr);
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
555
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
556 return NGX_OK;
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
557 }
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
558
257785918797 $geoip_dma_code and $geoip_area_code
Igor Sysoev <igor@sysoev.ru>
parents: 3398
diff changeset
559
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
560 static GeoIPRecord *
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
561 ngx_stream_geoip_get_city_record(ngx_stream_session_t *s)
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
562 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
563 ngx_stream_geoip_conf_t *gcf;
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
564
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
565 gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip_module);
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
566
3919
0dceaa117e0d support IPv4 mapped to IPv6 in geoip module
Igor Sysoev <igor@sysoev.ru>
parents: 3915
diff changeset
567 if (gcf->city) {
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
568 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
569 return gcf->city_v6
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
570 ? GeoIP_record_by_ipnum_v6(gcf->city,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
571 ngx_stream_geoip_addr_v6(s, gcf))
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
572 : GeoIP_record_by_ipnum(gcf->city,
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
573 ngx_stream_geoip_addr(s, gcf));
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
574 #else
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
575 return GeoIP_record_by_ipnum(gcf->city, ngx_stream_geoip_addr(s, gcf));
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
576 #endif
3398
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
577 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
578
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
579 return NULL;
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
580 }
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
581
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
582
236634d2b603 $geoip_city_continent_code, $geoip_latitude, $geoip_longitude
Igor Sysoev <igor@sysoev.ru>
parents: 3031
diff changeset
583 static ngx_int_t
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
584 ngx_stream_geoip_add_variables(ngx_conf_t *cf)
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
586 ngx_stream_variable_t *var, *v;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
588 for (v = ngx_stream_geoip_vars; v->name.len; v++) {
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
589 var = ngx_stream_add_variable(cf, &v->name, v->flags);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 if (var == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 return NGX_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594 var->get_handler = v->get_handler;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 var->data = v->data;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 return NGX_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 static void *
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
603 ngx_stream_geoip_create_conf(ngx_conf_t *cf)
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
605 ngx_pool_cleanup_t *cln;
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
606 ngx_stream_geoip_conf_t *conf;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
608 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_geoip_conf_t));
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 if (conf == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 return NULL;
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
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 cln = ngx_pool_cleanup_add(cf->pool, 0);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 if (cln == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 return NULL;
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
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
618 cln->handler = ngx_stream_geoip_cleanup;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619 cln->data = conf;
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 return conf;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622 }
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
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 static char *
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
626 ngx_stream_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
627 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
628 ngx_stream_geoip_conf_t *gcf = conf;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 ngx_str_t *value;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 if (gcf->country) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633 return "is duplicate";
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636 value = cf->args->elts;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638 gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);
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 if (gcf->country == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3914
2b92090d8a43 fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3859
diff changeset
642 "GeoIP_open(\"%V\") failed", &value[1]);
2985
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_ERROR;
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
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
647 if (cf->args->nelts == 3) {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
648 if (ngx_strcmp(value[2].data, "utf8") == 0) {
5758
f3df4e420ae7 Style: remove whitespace between function name and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5084
diff changeset
649 GeoIP_set_charset(gcf->country, GEOIP_CHARSET_UTF8);
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
650
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
651 } else {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
652 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
653 "invalid parameter \"%V\"", &value[2]);
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
654 return NGX_CONF_ERROR;
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
655 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
656 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
657
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 switch (gcf->country->databaseType) {
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 case GEOIP_COUNTRY_EDITION:
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 return NGX_CONF_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
664 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
665 case GEOIP_COUNTRY_EDITION_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
666
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
667 gcf->country_v6 = 1;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
668 return NGX_CONF_OK;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
669 #endif
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
670
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671 default:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673 "invalid GeoIP database \"%V\" type:%d",
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674 &value[1], gcf->country->databaseType);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
675 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
677 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680 static char *
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
681 ngx_stream_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
682 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
683 ngx_stream_geoip_conf_t *gcf = conf;
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
684
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
685 ngx_str_t *value;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
686
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
687 if (gcf->org) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
688 return "is duplicate";
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
689 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
690
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
691 value = cf->args->elts;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
692
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
693 gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
694
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
695 if (gcf->org == NULL) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
696 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
697 "GeoIP_open(\"%V\") failed", &value[1]);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
698
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
699 return NGX_CONF_ERROR;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
700 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
701
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
702 if (cf->args->nelts == 3) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
703 if (ngx_strcmp(value[2].data, "utf8") == 0) {
5758
f3df4e420ae7 Style: remove whitespace between function name and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5084
diff changeset
704 GeoIP_set_charset(gcf->org, GEOIP_CHARSET_UTF8);
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
705
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
706 } else {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
707 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
708 "invalid parameter \"%V\"", &value[2]);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
709 return NGX_CONF_ERROR;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
710 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
711 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
712
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
713 switch (gcf->org->databaseType) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
714
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
715 case GEOIP_ISP_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
716 case GEOIP_ORG_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
717 case GEOIP_DOMAIN_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
718 case GEOIP_ASNUM_EDITION:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
719
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
720 return NGX_CONF_OK;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
721
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
722 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
723 case GEOIP_ISP_EDITION_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
724 case GEOIP_ORG_EDITION_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
725 case GEOIP_DOMAIN_EDITION_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
726 case GEOIP_ASNUM_EDITION_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
727
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
728 gcf->org_v6 = 1;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
729 return NGX_CONF_OK;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
730 #endif
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
731
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
732 default:
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
733 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
734 "invalid GeoIP database \"%V\" type:%d",
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
735 &value[1], gcf->org->databaseType);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
736 return NGX_CONF_ERROR;
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
737 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
738 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
739
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
740
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
741 static char *
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
742 ngx_stream_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
744 ngx_stream_geoip_conf_t *gcf = conf;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
745
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746 ngx_str_t *value;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748 if (gcf->city) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749 return "is duplicate";
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
752 value = cf->args->elts;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
753
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754 gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
755
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
756 if (gcf->city == NULL) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3914
2b92090d8a43 fix typo
Igor Sysoev <igor@sysoev.ru>
parents: 3859
diff changeset
758 "GeoIP_open(\"%V\") failed", &value[1]);
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
761 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
762
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
763 if (cf->args->nelts == 3) {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
764 if (ngx_strcmp(value[2].data, "utf8") == 0) {
5758
f3df4e420ae7 Style: remove whitespace between function name and parentheses.
Piotr Sikora <piotr@cloudflare.com>
parents: 5084
diff changeset
765 GeoIP_set_charset(gcf->city, GEOIP_CHARSET_UTF8);
3859
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
766
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
767 } else {
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
768 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
769 "invalid parameter \"%V\"", &value[2]);
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
770 return NGX_CONF_ERROR;
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
771 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
772 }
30d4d6187316 utf8 parameter of geoip_country and geoip_city
Igor Sysoev <igor@sysoev.ru>
parents: 3742
diff changeset
773
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
774 switch (gcf->city->databaseType) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
775
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
776 case GEOIP_CITY_EDITION_REV0:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
777 case GEOIP_CITY_EDITION_REV1:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
778
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
779 return NGX_CONF_OK;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
780
5015
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
781 #if (NGX_HAVE_GEOIP_V6)
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
782 case GEOIP_CITY_EDITION_REV0_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
783 case GEOIP_CITY_EDITION_REV1_V6:
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
784
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
785 gcf->city_v6 = 1;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
786 return NGX_CONF_OK;
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
787 #endif
a74d211f034d GeoIP: IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4828
diff changeset
788
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
789 default:
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
790 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
791 "invalid GeoIP City database \"%V\" type:%d",
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
792 &value[1], gcf->city->databaseType);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
793 return NGX_CONF_ERROR;
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
794 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
795 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
796
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
797
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
798 static void
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
799 ngx_stream_geoip_cleanup(void *data)
4627
3152e4c371d7 geoip: trusted proxies support and partial IPv6 support.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
800 {
6630
558db057adaa Stream: geoip module.
Vladimir Homutov <vl@nginx.com>
parents: 5773
diff changeset
801 ngx_stream_geoip_conf_t *gcf = data;
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
802
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
803 if (gcf->country) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
804 GeoIP_delete(gcf->country);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
805 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
806
3915
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
807 if (gcf->org) {
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
808 GeoIP_delete(gcf->org);
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
809 }
e3645e338937 geoip_org
Igor Sysoev <igor@sysoev.ru>
parents: 3914
diff changeset
810
2985
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
811 if (gcf->city) {
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
812 GeoIP_delete(gcf->city);
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
813 }
31af2d1a742e ngx_http_geoip_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
814 }