annotate src/http/modules/ngx_http_access_module.c @ 4248:2fad4d19ea4b stable-1.0

Merging r4151, r4152, r4177: HTTP cache related fixes: *) Cache: fix for sending of empty responses. Revert wrong fix for empty responses introduced in 0.8.31 and apply new one, rewritten to match things done by static module as close as possible. *) Cache: fix for sending of stale responses. For normal cached responses ngx_http_cache_send() sends last buffer and then request finalized via ngx_http_finalize_request() call, i.e. everything is ok. But for stale responses (i.e. when upstream died, but we have something in cache) the same ngx_http_cache_send() sends last buffer, but then in ngx_http_upstream_finalize_request() another last buffer is send. This causes duplicate final chunk to appear if chunked encoding is used (and resulting problems with keepalive connections and so on). Fix this by not sending in ngx_http_upstream_finalize_request() another last buffer if we know response was from cache. *) Fixed cache bypass caching of non-cacheable replies (ticket #21). If cache was bypassed with proxy_cache_bypass, cache-controlling headers (Cache-Control, Expires) wasn't considered and response was cached even if it was actually non-cacheable. Patch by John Ferlito.
author Igor Sysoev <igor@sysoev.ru>
date Tue, 01 Nov 2011 13:49:31 +0000
parents bab3488bd113
children d620f497c50f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
4 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 408
diff changeset
5
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 typedef struct {
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
13 in_addr_t mask;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
14 in_addr_t addr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
15 ngx_uint_t deny; /* unsigned deny:1; */
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 } ngx_http_access_rule_t;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
18 #if (NGX_HAVE_INET6)
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 typedef struct {
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
21 struct in6_addr addr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
22 struct in6_addr mask;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
23 ngx_uint_t deny; /* unsigned deny:1; */
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
24 } ngx_http_access_rule6_t;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
25
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
26 #endif
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
27
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
28 typedef struct {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
29 ngx_array_t *rules; /* array of ngx_http_access_rule_t */
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
30 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
31 ngx_array_t *rules6; /* array of ngx_http_access_rule6_t */
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
32 #endif
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 } ngx_http_access_loc_conf_t;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 static ngx_int_t ngx_http_access_handler(ngx_http_request_t *r);
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
37 static ngx_int_t ngx_http_access_inet(ngx_http_request_t *r,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
38 ngx_http_access_loc_conf_t *alcf, in_addr_t addr);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
39 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
40 static ngx_int_t ngx_http_access_inet6(ngx_http_request_t *r,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
41 ngx_http_access_loc_conf_t *alcf, u_char *p);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
42 #endif
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
43 static ngx_int_t ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 static char *ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
45 void *conf);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 static void *ngx_http_access_create_loc_conf(ngx_conf_t *cf);
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 static char *ngx_http_access_merge_loc_conf(ngx_conf_t *cf,
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
48 void *parent, void *child);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
49 static ngx_int_t ngx_http_access_init(ngx_conf_t *cf);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 static ngx_command_t ngx_http_access_commands[] = {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 { ngx_string("allow"),
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
55 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
56 |NGX_CONF_TAKE1,
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 ngx_http_access_rule,
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 NGX_HTTP_LOC_CONF_OFFSET,
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 0,
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 NULL },
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 { ngx_string("deny"),
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
63 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
64 |NGX_CONF_TAKE1,
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 ngx_http_access_rule,
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 NGX_HTTP_LOC_CONF_OFFSET,
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 0,
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 NULL },
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 ngx_null_command
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 };
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
75 static ngx_http_module_t ngx_http_access_module_ctx = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
76 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
77 ngx_http_access_init, /* postconfiguration */
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 NULL, /* create main configuration */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 NULL, /* init main configuration */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 NULL, /* create server configuration */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 NULL, /* merge server configuration */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 ngx_http_access_create_loc_conf, /* create location configuration */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 ngx_http_access_merge_loc_conf /* merge location configuration */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 };
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 ngx_module_t ngx_http_access_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
91 NGX_MODULE_V1,
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 &ngx_http_access_module_ctx, /* module context */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 ngx_http_access_commands, /* module directives */
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
95 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
96 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
97 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
98 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
99 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
100 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
101 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
102 NGX_MODULE_V1_PADDING
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 };
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
106 static ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
107 ngx_http_access_handler(ngx_http_request_t *r)
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
109 struct sockaddr_in *sin;
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 ngx_http_access_loc_conf_t *alcf;
3921
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
111 #if (NGX_HAVE_INET6)
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
112 u_char *p;
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
113 in_addr_t addr;
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
114 struct sockaddr_in6 *sin6;
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
115 #endif
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module);
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
3921
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
119 switch (r->connection->sockaddr->sa_family) {
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
120
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
121 case AF_INET:
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
122 if (alcf->rules) {
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
123 sin = (struct sockaddr_in *) r->connection->sockaddr;
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
124 return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
125 }
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
126 break;
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
127
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
128 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
129
3921
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
130 case AF_INET6:
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
131 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
132 p = sin6->sin6_addr.s6_addr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
133
3921
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
134 if (alcf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
135 addr = p[12] << 24;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
136 addr += p[13] << 16;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
137 addr += p[14] << 8;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
138 addr += p[15];
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
139 return ngx_http_access_inet(r, alcf, htonl(addr));
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
140 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
141
3921
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
142 if (alcf->rules6) {
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
143 return ngx_http_access_inet6(r, alcf, p);
bab3488bd113 fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
Igor Sysoev <igor@sysoev.ru>
parents: 3685
diff changeset
144 }
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
146 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
147 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
148
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
149 return NGX_DECLINED;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
150 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
151
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
152
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
153 static ngx_int_t
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
154 ngx_http_access_inet(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
155 in_addr_t addr)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
156 {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
157 ngx_uint_t i;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
158 ngx_http_access_rule_t *rule;
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 rule = alcf->rules->elts;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 for (i = 0; i < alcf->rules->nelts; i++) {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
163 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
164 "access: %08XD %08XD %08XD",
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
165 addr, rule[i].mask, rule[i].addr);
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
166
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
167 if ((addr & rule[i].mask) == rule[i].addr) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
168 return ngx_http_access_found(r, rule[i].deny);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171
1786
adca43955f79 return NGX_DECLINED if access directives are not active,
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
172 return NGX_DECLINED;
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
176 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
177
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
178 static ngx_int_t
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
179 ngx_http_access_inet6(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
180 u_char *p)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
181 {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
182 ngx_uint_t n;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
183 ngx_uint_t i;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
184 ngx_http_access_rule6_t *rule6;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
185
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
186 rule6 = alcf->rules6->elts;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
187 for (i = 0; i < alcf->rules6->nelts; i++) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
188
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
189 #if (NGX_DEBUG)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
190 {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
191 size_t cl, ml, al;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
192 u_char ct[NGX_INET6_ADDRSTRLEN];
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
193 u_char mt[NGX_INET6_ADDRSTRLEN];
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
194 u_char at[NGX_INET6_ADDRSTRLEN];
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
195
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
196 cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
197 ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
198 al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
199
3685
9ec7238feac6 fix building by msvc7
Igor Sysoev <igor@sysoev.ru>
parents: 3284
diff changeset
200 ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
201 "access: %*s %*s %*s", cl, ct, ml, mt, al, at);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
202 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
203 #endif
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
204
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
205 for (n = 0; n < 16; n++) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
206 if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
207 goto next;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
208 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
209 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
210
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
211 return ngx_http_access_found(r, rule6[i].deny);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
212
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
213 next:
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
214 continue;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
215 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
216
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
217 return NGX_DECLINED;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
218 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
219
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
220 #endif
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
221
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
222
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
223 static ngx_int_t
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
224 ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
225 {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
226 ngx_http_core_loc_conf_t *clcf;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
227
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
228 if (deny) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
229 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
230
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
231 if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
232 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
233 "access forbidden by rule");
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
234 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
235
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
236 return NGX_HTTP_FORBIDDEN;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
237 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
238
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
239 return NGX_OK;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
240 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
241
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
242
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
243 static char *
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
244 ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 ngx_http_access_loc_conf_t *alcf = conf;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
248 ngx_int_t rc;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
249 ngx_uint_t all;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
250 ngx_str_t *value;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
251 ngx_cidr_t cidr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
252 ngx_http_access_rule_t *rule;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
253 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
254 ngx_http_access_rule6_t *rule6;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
255 #endif
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
257 ngx_memzero(&cidr, sizeof(ngx_cidr_t));
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 value = cf->args->elts;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
261 all = (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
262
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
263 if (!all) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
264
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
265 rc = ngx_ptocidr(&value[1], &cidr);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
267 if (rc == NGX_ERROR) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
268 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
269 "invalid parameter \"%V\"", &value[1]);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
270 return NGX_CONF_ERROR;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
271 }
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
273 if (rc == NGX_DONE) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
274 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
275 "low address bits of %V are meaningless", &value[1]);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
276 }
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
279 switch (cidr.family) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
280
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
281 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
282 case AF_INET6:
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
283 case 0: /* all */
1380
b590a528fd41 ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
284
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
285 if (alcf->rules6 == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
286 alcf->rules6 = ngx_array_create(cf->pool, 4,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
287 sizeof(ngx_http_access_rule6_t));
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
288 if (alcf->rules6 == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
289 return NGX_CONF_ERROR;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
290 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
291 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
292
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
293 rule6 = ngx_array_push(alcf->rules6);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
294 if (rule6 == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
295 return NGX_CONF_ERROR;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
296 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
297
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
298 rule6->mask = cidr.u.in6.mask;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
299 rule6->addr = cidr.u.in6.addr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
300 rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
301
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
302 if (!all) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
303 break;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
304 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
305
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
306 /* "all" passes through */
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
307 #endif
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
308
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
309 default: /* AF_INET */
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
310
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
311 if (alcf->rules == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
312 alcf->rules = ngx_array_create(cf->pool, 4,
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
313 sizeof(ngx_http_access_rule_t));
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
314 if (alcf->rules == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
315 return NGX_CONF_ERROR;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
316 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
317 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
318
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
319 rule = ngx_array_push(alcf->rules);
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
320 if (rule == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
321 return NGX_CONF_ERROR;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
322 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
323
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
324 rule->mask = cidr.u.in.mask;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
325 rule->addr = cidr.u.in.addr;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
326 rule->deny = (value[0].data[0] == 'd') ? 1 : 0;
1380
b590a528fd41 ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
327 }
b590a528fd41 ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
328
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 return NGX_CONF_OK;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
333 static void *
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
334 ngx_http_access_create_loc_conf(ngx_conf_t *cf)
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335 {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 ngx_http_access_loc_conf_t *conf;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
338 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_access_loc_conf_t));
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
339 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2537
diff changeset
340 return NULL;
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 return conf;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
347 static char *
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
348 ngx_http_access_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 ngx_http_access_loc_conf_t *prev = parent;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 ngx_http_access_loc_conf_t *conf = child;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 if (conf->rules == NULL) {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 conf->rules = prev->rules;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356
3278
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
357 #if (NGX_HAVE_INET6)
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
358 if (conf->rules6 == NULL) {
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
359 conf->rules6 = prev->rules6;
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
360 }
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
361 #endif
ab9f5a715805 IPv6 support in ngx_http_access_module
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
362
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 return NGX_CONF_OK;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
367 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
368 ngx_http_access_init(ngx_conf_t *cf)
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369 {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370 ngx_http_handler_pt *h;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 ngx_http_core_main_conf_t *cmcf;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
373 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 499
diff changeset
375 h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 if (h == NULL) {
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377 return NGX_ERROR;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378 }
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 *h = ngx_http_access_handler;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 return NGX_OK;
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 }