nginxtra 1.2.0.1 → 1.2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/nginxtra +1 -1
- data/lib/nginxtra.rb +2 -0
- data/lib/nginxtra/action.rb +1 -1
- data/lib/nginxtra/actions/convert.rb +67 -0
- data/lib/nginxtra/actions/install.rb +3 -0
- data/lib/nginxtra/cli.rb +20 -0
- data/lib/nginxtra/config_converter.rb +324 -0
- data/lib/nginxtra/error.rb +3 -0
- data/src/nginx/CHANGES +45 -0
- data/src/nginx/CHANGES.ru +46 -0
- data/src/nginx/src/core/nginx.h +2 -2
- data/src/nginx/src/core/ngx_resolver.c +14 -2
- data/src/nginx/src/event/ngx_event.c +18 -21
- data/src/nginx/src/event/ngx_event.h +0 -6
- data/src/nginx/src/event/ngx_event_accept.c +90 -13
- data/src/nginx/src/event/ngx_event_openssl.c +1 -0
- data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +26 -4
- data/src/nginx/src/http/modules/ngx_http_flv_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_geo_module.c +62 -74
- data/src/nginx/src/http/modules/ngx_http_geoip_module.c +130 -30
- data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_mp4_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_realip_module.c +45 -93
- data/src/nginx/src/http/modules/ngx_http_scgi_module.c +2 -0
- data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +2 -0
- data/src/nginx/src/http/modules/perl/nginx.pm +1 -1
- data/src/nginx/src/http/ngx_http_core_module.c +104 -0
- data/src/nginx/src/http/ngx_http_core_module.h +3 -0
- data/src/nginx/src/http/ngx_http_parse.c +20 -0
- data/src/nginx/src/http/ngx_http_request.c +26 -15
- data/src/nginx/src/http/ngx_http_script.c +0 -1
- data/src/nginx/src/http/ngx_http_upstream_round_robin.c +72 -170
- data/src/nginx/src/http/ngx_http_upstream_round_robin.h +1 -0
- data/src/nginx/src/os/unix/ngx_errno.h +2 -0
- metadata +6 -4
@@ -51,6 +51,7 @@ typedef struct {
|
|
51
51
|
unsigned outside_entries:1;
|
52
52
|
unsigned allow_binary_include:1;
|
53
53
|
unsigned binary_include:1;
|
54
|
+
unsigned proxy_recursive:1;
|
54
55
|
} ngx_http_geo_conf_ctx_t;
|
55
56
|
|
56
57
|
|
@@ -61,6 +62,7 @@ typedef struct {
|
|
61
62
|
} u;
|
62
63
|
|
63
64
|
ngx_array_t *proxies;
|
65
|
+
unsigned proxy_recursive:1;
|
64
66
|
|
65
67
|
ngx_int_t index;
|
66
68
|
} ngx_http_geo_ctx_t;
|
@@ -68,8 +70,8 @@ typedef struct {
|
|
68
70
|
|
69
71
|
static in_addr_t ngx_http_geo_addr(ngx_http_request_t *r,
|
70
72
|
ngx_http_geo_ctx_t *ctx);
|
71
|
-
static
|
72
|
-
ngx_http_geo_ctx_t *ctx);
|
73
|
+
static ngx_int_t ngx_http_geo_real_addr(ngx_http_request_t *r,
|
74
|
+
ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr);
|
73
75
|
static char *ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
|
74
76
|
static char *ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf);
|
75
77
|
static char *ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
|
@@ -212,87 +214,60 @@ ngx_http_geo_range_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
|
|
212
214
|
static in_addr_t
|
213
215
|
ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx)
|
214
216
|
{
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
ngx_uint_t i, n;
|
219
|
-
ngx_in_cidr_t *proxies;
|
220
|
-
ngx_table_elt_t *xfwd;
|
217
|
+
ngx_addr_t addr;
|
218
|
+
ngx_table_elt_t *xfwd;
|
219
|
+
struct sockaddr_in *sin;
|
221
220
|
|
222
|
-
|
221
|
+
if (ngx_http_geo_real_addr(r, ctx, &addr) != NGX_OK) {
|
222
|
+
return INADDR_NONE;
|
223
|
+
}
|
223
224
|
|
224
225
|
xfwd = r->headers_in.x_forwarded_for;
|
225
226
|
|
226
|
-
if (xfwd
|
227
|
-
|
227
|
+
if (xfwd != NULL && ctx->proxies != NULL) {
|
228
|
+
(void) ngx_http_get_forwarded_addr(r, &addr, xfwd->value.data,
|
229
|
+
xfwd->value.len, ctx->proxies,
|
230
|
+
ctx->proxy_recursive);
|
228
231
|
}
|
229
232
|
|
230
|
-
|
231
|
-
n = ctx->proxies->nelts;
|
232
|
-
|
233
|
-
for (i = 0; i < n; i++) {
|
234
|
-
if ((addr & proxies[i].mask) == proxies[i].addr) {
|
233
|
+
#if (NGX_HAVE_INET6)
|
235
234
|
|
236
|
-
|
237
|
-
|
235
|
+
if (addr.sockaddr->sa_family == AF_INET6) {
|
236
|
+
struct in6_addr *inaddr6;
|
238
237
|
|
239
|
-
|
240
|
-
if (*p == ' ' || *p == ',') {
|
241
|
-
p++;
|
242
|
-
len -= p - ip;
|
243
|
-
ip = p;
|
244
|
-
break;
|
245
|
-
}
|
246
|
-
}
|
238
|
+
inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
|
247
239
|
|
248
|
-
|
240
|
+
if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
|
241
|
+
return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]);
|
249
242
|
}
|
250
243
|
}
|
251
244
|
|
252
|
-
|
245
|
+
#endif
|
246
|
+
|
247
|
+
if (addr.sockaddr->sa_family != AF_INET) {
|
248
|
+
return INADDR_NONE;
|
249
|
+
}
|
250
|
+
|
251
|
+
sin = (struct sockaddr_in *) addr.sockaddr;
|
252
|
+
return ntohl(sin->sin_addr.s_addr);
|
253
253
|
}
|
254
254
|
|
255
255
|
|
256
|
-
static
|
257
|
-
ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx
|
256
|
+
static ngx_int_t
|
257
|
+
ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,
|
258
|
+
ngx_addr_t *addr)
|
258
259
|
{
|
259
|
-
struct sockaddr_in *sin;
|
260
260
|
ngx_http_variable_value_t *v;
|
261
|
-
#if (NGX_HAVE_INET6)
|
262
|
-
u_char *p;
|
263
|
-
in_addr_t addr;
|
264
|
-
struct sockaddr_in6 *sin6;
|
265
|
-
#endif
|
266
261
|
|
267
262
|
if (ctx->index == -1) {
|
268
263
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
269
264
|
"http geo started: %V", &r->connection->addr_text);
|
270
265
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
sin = (struct sockaddr_in *) r->connection->sockaddr;
|
275
|
-
return ntohl(sin->sin_addr.s_addr);
|
276
|
-
|
277
|
-
#if (NGX_HAVE_INET6)
|
278
|
-
|
279
|
-
case AF_INET6:
|
280
|
-
sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
|
281
|
-
|
282
|
-
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
|
283
|
-
p = sin6->sin6_addr.s6_addr;
|
284
|
-
addr = p[12] << 24;
|
285
|
-
addr += p[13] << 16;
|
286
|
-
addr += p[14] << 8;
|
287
|
-
addr += p[15];
|
288
|
-
|
289
|
-
return addr;
|
290
|
-
}
|
266
|
+
addr->sockaddr = r->connection->sockaddr;
|
267
|
+
addr->socklen = r->connection->socklen;
|
268
|
+
/* addr->name = r->connection->addr_text; */
|
291
269
|
|
292
|
-
|
293
|
-
}
|
294
|
-
|
295
|
-
return INADDR_NONE;
|
270
|
+
return NGX_OK;
|
296
271
|
}
|
297
272
|
|
298
273
|
v = ngx_http_get_flushed_variable(r, ctx->index);
|
@@ -301,13 +276,17 @@ ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx)
|
|
301
276
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
302
277
|
"http geo not found");
|
303
278
|
|
304
|
-
return
|
279
|
+
return NGX_ERROR;
|
305
280
|
}
|
306
281
|
|
307
282
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
308
283
|
"http geo started: %v", v);
|
309
284
|
|
310
|
-
|
285
|
+
if (ngx_parse_addr(r->pool, addr, v->data, v->len) == NGX_OK) {
|
286
|
+
return NGX_OK;
|
287
|
+
}
|
288
|
+
|
289
|
+
return NGX_ERROR;
|
311
290
|
}
|
312
291
|
|
313
292
|
|
@@ -388,6 +367,7 @@ ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
388
367
|
*cf = save;
|
389
368
|
|
390
369
|
geo->proxies = ctx.proxies;
|
370
|
+
geo->proxy_recursive = ctx.proxy_recursive;
|
391
371
|
|
392
372
|
if (ctx.high.low) {
|
393
373
|
|
@@ -493,6 +473,12 @@ ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
|
|
493
473
|
|
494
474
|
goto done;
|
495
475
|
}
|
476
|
+
|
477
|
+
else if (ngx_strcmp(value[0].data, "proxy_recursive") == 0) {
|
478
|
+
ctx->proxy_recursive = 1;
|
479
|
+
rv = NGX_CONF_OK;
|
480
|
+
goto done;
|
481
|
+
}
|
496
482
|
}
|
497
483
|
|
498
484
|
if (cf->args->nelts != 2) {
|
@@ -926,6 +912,7 @@ ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
|
|
926
912
|
}
|
927
913
|
|
928
914
|
if (ngx_strcmp(value[0].data, "default") == 0) {
|
915
|
+
/* cidr.family = AF_INET; */
|
929
916
|
cidr.u.in.addr = 0;
|
930
917
|
cidr.u.in.mask = 0;
|
931
918
|
net = &value[0];
|
@@ -944,6 +931,15 @@ ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
|
|
944
931
|
return NGX_CONF_ERROR;
|
945
932
|
}
|
946
933
|
|
934
|
+
if (cidr.family != AF_INET) {
|
935
|
+
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
936
|
+
"\"geo\" supports IPv4 only");
|
937
|
+
return NGX_CONF_ERROR;
|
938
|
+
}
|
939
|
+
|
940
|
+
cidr.u.in.addr = ntohl(cidr.u.in.addr);
|
941
|
+
cidr.u.in.mask = ntohl(cidr.u.in.mask);
|
942
|
+
|
947
943
|
if (del) {
|
948
944
|
if (ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr,
|
949
945
|
cidr.u.in.mask)
|
@@ -1052,10 +1048,10 @@ static char *
|
|
1052
1048
|
ngx_http_geo_add_proxy(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
|
1053
1049
|
ngx_cidr_t *cidr)
|
1054
1050
|
{
|
1055
|
-
|
1051
|
+
ngx_cidr_t *c;
|
1056
1052
|
|
1057
1053
|
if (ctx->proxies == NULL) {
|
1058
|
-
ctx->proxies = ngx_array_create(ctx->pool, 4, sizeof(
|
1054
|
+
ctx->proxies = ngx_array_create(ctx->pool, 4, sizeof(ngx_cidr_t));
|
1059
1055
|
if (ctx->proxies == NULL) {
|
1060
1056
|
return NGX_CONF_ERROR;
|
1061
1057
|
}
|
@@ -1066,8 +1062,7 @@ ngx_http_geo_add_proxy(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
|
|
1066
1062
|
return NGX_CONF_ERROR;
|
1067
1063
|
}
|
1068
1064
|
|
1069
|
-
c
|
1070
|
-
c->mask = cidr->u.in.mask;
|
1065
|
+
*c = *cidr;
|
1071
1066
|
|
1072
1067
|
return NGX_CONF_OK;
|
1073
1068
|
}
|
@@ -1079,6 +1074,7 @@ ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)
|
|
1079
1074
|
ngx_int_t rc;
|
1080
1075
|
|
1081
1076
|
if (ngx_strcmp(net->data, "255.255.255.255") == 0) {
|
1077
|
+
cidr->family = AF_INET;
|
1082
1078
|
cidr->u.in.addr = 0xffffffff;
|
1083
1079
|
cidr->u.in.mask = 0xffffffff;
|
1084
1080
|
|
@@ -1092,19 +1088,11 @@ ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)
|
|
1092
1088
|
return NGX_ERROR;
|
1093
1089
|
}
|
1094
1090
|
|
1095
|
-
if (cidr->family != AF_INET) {
|
1096
|
-
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "\"geo\" supports IPv4 only");
|
1097
|
-
return NGX_ERROR;
|
1098
|
-
}
|
1099
|
-
|
1100
1091
|
if (rc == NGX_DONE) {
|
1101
1092
|
ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
|
1102
1093
|
"low address bits of %V are meaningless", net);
|
1103
1094
|
}
|
1104
1095
|
|
1105
|
-
cidr->u.in.addr = ntohl(cidr->u.in.addr);
|
1106
|
-
cidr->u.in.mask = ntohl(cidr->u.in.mask);
|
1107
|
-
|
1108
1096
|
return NGX_OK;
|
1109
1097
|
}
|
1110
1098
|
|
@@ -14,20 +14,24 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
typedef struct {
|
17
|
-
GeoIP
|
18
|
-
GeoIP
|
19
|
-
GeoIP
|
17
|
+
GeoIP *country;
|
18
|
+
GeoIP *org;
|
19
|
+
GeoIP *city;
|
20
|
+
ngx_array_t *proxies; /* array of ngx_cidr_t */
|
21
|
+
ngx_flag_t proxy_recursive;
|
20
22
|
} ngx_http_geoip_conf_t;
|
21
23
|
|
22
24
|
|
23
25
|
typedef struct {
|
24
|
-
ngx_str_t
|
25
|
-
uintptr_t
|
26
|
+
ngx_str_t *name;
|
27
|
+
uintptr_t data;
|
26
28
|
} ngx_http_geoip_var_t;
|
27
29
|
|
28
30
|
|
29
31
|
typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, u_long addr);
|
30
32
|
|
33
|
+
static u_long ngx_http_geoip_addr(ngx_http_request_t *r,
|
34
|
+
ngx_http_geoip_conf_t *gcf);
|
31
35
|
static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r,
|
32
36
|
ngx_http_variable_value_t *v, uintptr_t data);
|
33
37
|
static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r,
|
@@ -44,12 +48,17 @@ static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);
|
|
44
48
|
|
45
49
|
static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
|
46
50
|
static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
|
51
|
+
static char *ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf);
|
47
52
|
static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd,
|
48
53
|
void *conf);
|
49
54
|
static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd,
|
50
55
|
void *conf);
|
51
56
|
static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd,
|
52
57
|
void *conf);
|
58
|
+
static char *ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd,
|
59
|
+
void *conf);
|
60
|
+
static ngx_int_t ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net,
|
61
|
+
ngx_cidr_t *cidr);
|
53
62
|
static void ngx_http_geoip_cleanup(void *data);
|
54
63
|
|
55
64
|
|
@@ -76,6 +85,20 @@ static ngx_command_t ngx_http_geoip_commands[] = {
|
|
76
85
|
0,
|
77
86
|
NULL },
|
78
87
|
|
88
|
+
{ ngx_string("geoip_proxy"),
|
89
|
+
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
|
90
|
+
ngx_http_geoip_proxy,
|
91
|
+
NGX_HTTP_MAIN_CONF_OFFSET,
|
92
|
+
0,
|
93
|
+
NULL },
|
94
|
+
|
95
|
+
{ ngx_string("geoip_proxy_recursive"),
|
96
|
+
NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,
|
97
|
+
ngx_conf_set_flag_slot,
|
98
|
+
NGX_HTTP_MAIN_CONF_OFFSET,
|
99
|
+
offsetof(ngx_http_geoip_conf_t, proxy_recursive),
|
100
|
+
NULL },
|
101
|
+
|
79
102
|
ngx_null_command
|
80
103
|
};
|
81
104
|
|
@@ -85,7 +108,7 @@ static ngx_http_module_t ngx_http_geoip_module_ctx = {
|
|
85
108
|
NULL, /* postconfiguration */
|
86
109
|
|
87
110
|
ngx_http_geoip_create_conf, /* create main configuration */
|
88
|
-
|
111
|
+
ngx_http_geoip_init_conf, /* init main configuration */
|
89
112
|
|
90
113
|
NULL, /* create server configuration */
|
91
114
|
NULL, /* merge server configuration */
|
@@ -182,40 +205,44 @@ static ngx_http_variable_t ngx_http_geoip_vars[] = {
|
|
182
205
|
|
183
206
|
|
184
207
|
static u_long
|
185
|
-
ngx_http_geoip_addr(ngx_http_request_t *r)
|
208
|
+
ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)
|
186
209
|
{
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
u_long addr;
|
191
|
-
struct sockaddr_in6 *sin6;
|
192
|
-
#endif
|
210
|
+
ngx_addr_t addr;
|
211
|
+
ngx_table_elt_t *xfwd;
|
212
|
+
struct sockaddr_in *sin;
|
193
213
|
|
194
|
-
|
214
|
+
addr.sockaddr = r->connection->sockaddr;
|
215
|
+
addr.socklen = r->connection->socklen;
|
216
|
+
/* addr.name = r->connection->addr_text; */
|
195
217
|
|
196
|
-
|
197
|
-
|
198
|
-
|
218
|
+
xfwd = r->headers_in.x_forwarded_for;
|
219
|
+
|
220
|
+
if (xfwd != NULL && gcf->proxies != NULL) {
|
221
|
+
(void) ngx_http_get_forwarded_addr(r, &addr, xfwd->value.data,
|
222
|
+
xfwd->value.len, gcf->proxies,
|
223
|
+
gcf->proxy_recursive);
|
224
|
+
}
|
199
225
|
|
200
226
|
#if (NGX_HAVE_INET6)
|
201
227
|
|
202
|
-
|
203
|
-
|
228
|
+
if (addr.sockaddr->sa_family == AF_INET6) {
|
229
|
+
struct in6_addr *inaddr6;
|
204
230
|
|
205
|
-
|
206
|
-
p = sin6->sin6_addr.s6_addr;
|
207
|
-
addr = p[12] << 24;
|
208
|
-
addr += p[13] << 16;
|
209
|
-
addr += p[14] << 8;
|
210
|
-
addr += p[15];
|
231
|
+
inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
|
211
232
|
|
212
|
-
|
233
|
+
if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
|
234
|
+
return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]);
|
213
235
|
}
|
236
|
+
}
|
214
237
|
|
215
238
|
#endif
|
239
|
+
|
240
|
+
if (addr.sockaddr->sa_family != AF_INET) {
|
241
|
+
return INADDR_NONE;
|
216
242
|
}
|
217
243
|
|
218
|
-
|
244
|
+
sin = (struct sockaddr_in *) addr.sockaddr;
|
245
|
+
return ntohl(sin->sin_addr.s_addr);
|
219
246
|
}
|
220
247
|
|
221
248
|
|
@@ -235,7 +262,7 @@ ngx_http_geoip_country_variable(ngx_http_request_t *r,
|
|
235
262
|
goto not_found;
|
236
263
|
}
|
237
264
|
|
238
|
-
val = handler(gcf->country, ngx_http_geoip_addr(r));
|
265
|
+
val = handler(gcf->country, ngx_http_geoip_addr(r, gcf));
|
239
266
|
|
240
267
|
if (val == NULL) {
|
241
268
|
goto not_found;
|
@@ -273,7 +300,7 @@ ngx_http_geoip_org_variable(ngx_http_request_t *r,
|
|
273
300
|
goto not_found;
|
274
301
|
}
|
275
302
|
|
276
|
-
val = handler(gcf->org, ngx_http_geoip_addr(r));
|
303
|
+
val = handler(gcf->org, ngx_http_geoip_addr(r, gcf));
|
277
304
|
|
278
305
|
if (val == NULL) {
|
279
306
|
goto not_found;
|
@@ -453,7 +480,7 @@ ngx_http_geoip_get_city_record(ngx_http_request_t *r)
|
|
453
480
|
gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
|
454
481
|
|
455
482
|
if (gcf->city) {
|
456
|
-
return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r));
|
483
|
+
return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r, gcf));
|
457
484
|
}
|
458
485
|
|
459
486
|
return NULL;
|
@@ -490,6 +517,8 @@ ngx_http_geoip_create_conf(ngx_conf_t *cf)
|
|
490
517
|
return NULL;
|
491
518
|
}
|
492
519
|
|
520
|
+
conf->proxy_recursive = NGX_CONF_UNSET;
|
521
|
+
|
493
522
|
cln = ngx_pool_cleanup_add(cf->pool, 0);
|
494
523
|
if (cln == NULL) {
|
495
524
|
return NULL;
|
@@ -502,6 +531,17 @@ ngx_http_geoip_create_conf(ngx_conf_t *cf)
|
|
502
531
|
}
|
503
532
|
|
504
533
|
|
534
|
+
static char *
|
535
|
+
ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf)
|
536
|
+
{
|
537
|
+
ngx_http_geoip_conf_t *gcf = conf;
|
538
|
+
|
539
|
+
ngx_conf_init_value(gcf->proxy_recursive, 0);
|
540
|
+
|
541
|
+
return NGX_CONF_OK;
|
542
|
+
}
|
543
|
+
|
544
|
+
|
505
545
|
static char *
|
506
546
|
ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
507
547
|
{
|
@@ -652,6 +692,66 @@ ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|
652
692
|
}
|
653
693
|
|
654
694
|
|
695
|
+
static char *
|
696
|
+
ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
697
|
+
{
|
698
|
+
ngx_http_geoip_conf_t *gcf = conf;
|
699
|
+
|
700
|
+
ngx_str_t *value;
|
701
|
+
ngx_cidr_t cidr, *c;
|
702
|
+
|
703
|
+
value = cf->args->elts;
|
704
|
+
|
705
|
+
if (ngx_http_geoip_cidr_value(cf, &value[1], &cidr) != NGX_OK) {
|
706
|
+
return NGX_CONF_ERROR;
|
707
|
+
}
|
708
|
+
|
709
|
+
if (gcf->proxies == NULL) {
|
710
|
+
gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t));
|
711
|
+
if (gcf->proxies == NULL) {
|
712
|
+
return NGX_CONF_ERROR;
|
713
|
+
}
|
714
|
+
}
|
715
|
+
|
716
|
+
c = ngx_array_push(gcf->proxies);
|
717
|
+
if (c == NULL) {
|
718
|
+
return NGX_CONF_ERROR;
|
719
|
+
}
|
720
|
+
|
721
|
+
*c = cidr;
|
722
|
+
|
723
|
+
return NGX_CONF_OK;
|
724
|
+
}
|
725
|
+
|
726
|
+
static ngx_int_t
|
727
|
+
ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr)
|
728
|
+
{
|
729
|
+
ngx_int_t rc;
|
730
|
+
|
731
|
+
if (ngx_strcmp(net->data, "255.255.255.255") == 0) {
|
732
|
+
cidr->family = AF_INET;
|
733
|
+
cidr->u.in.addr = 0xffffffff;
|
734
|
+
cidr->u.in.mask = 0xffffffff;
|
735
|
+
|
736
|
+
return NGX_OK;
|
737
|
+
}
|
738
|
+
|
739
|
+
rc = ngx_ptocidr(net, cidr);
|
740
|
+
|
741
|
+
if (rc == NGX_ERROR) {
|
742
|
+
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net);
|
743
|
+
return NGX_ERROR;
|
744
|
+
}
|
745
|
+
|
746
|
+
if (rc == NGX_DONE) {
|
747
|
+
ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
|
748
|
+
"low address bits of %V are meaningless", net);
|
749
|
+
}
|
750
|
+
|
751
|
+
return NGX_OK;
|
752
|
+
}
|
753
|
+
|
754
|
+
|
655
755
|
static void
|
656
756
|
ngx_http_geoip_cleanup(void *data)
|
657
757
|
{
|