1 
2 
3 char *
ndk_conf_set_regex_slot(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)4 ndk_conf_set_regex_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
5 {
6     char  *p = conf;
7 
8     ngx_str_t               *value;
9     ngx_conf_post_t         *post;
10     ngx_regex_elt_t         *re;
11     ngx_regex_compile_t      rc;
12     u_char                   errstr[NGX_MAX_CONF_ERRSTR];
13 
14     re = (ngx_regex_elt_t *) (p + cmd->offset);
15 
16     if (re->name) {
17         return  "is duplicate";
18     }
19 
20     value = cf->args->elts;
21     value++;
22 
23     ndk_zerov (rc);
24 
25     rc.pool = cf->pool;
26     rc.err.len = NGX_MAX_CONF_ERRSTR;
27     rc.err.data = errstr;
28     rc.pattern = *value;
29 
30     if (ngx_regex_compile(&rc) != NGX_OK) {
31         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
32         return NGX_CONF_ERROR;
33     }
34 
35     re->regex = rc.regex;
36     re->name = value->data;
37 
38     if (cmd->post) {
39         post = cmd->post;
40         return  post->post_handler (cf, post, re);
41     }
42 
43     return  NGX_CONF_OK;
44 }
45 
46 
47 char *
ndk_conf_set_regex_caseless_slot(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)48 ndk_conf_set_regex_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
49 {
50     char  *p = conf;
51 
52     ngx_str_t               *value;
53     ngx_conf_post_t         *post;
54     ngx_regex_elt_t         *re;
55     ngx_regex_compile_t      rc;
56     u_char                   errstr[NGX_MAX_CONF_ERRSTR];
57 
58     re = (ngx_regex_elt_t *) (p + cmd->offset);
59 
60     if (re->name) {
61         return  "is duplicate";
62     }
63 
64     value = cf->args->elts;
65     value++;
66 
67     ndk_zerov (rc);
68 
69     rc.pool = cf->pool;
70     rc.err.len = NGX_MAX_CONF_ERRSTR;
71     rc.err.data = errstr;
72     rc.pattern = *value;
73     rc.options = NGX_REGEX_CASELESS;
74 
75     if (ngx_regex_compile(&rc) != NGX_OK) {
76         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
77         return NGX_CONF_ERROR;
78     }
79 
80     re->regex = rc.regex;
81     re->name = value->data;
82 
83     if (cmd->post) {
84         post = cmd->post;
85         return  post->post_handler (cf, post, re);
86     }
87 
88     return  NGX_CONF_OK;
89 }
90 
91 
92 
93 char *
ndk_conf_set_regex_array_slot(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)94 ndk_conf_set_regex_array_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
95 {
96     char  *p = conf;
97 
98     ngx_str_t               *value;
99     ngx_conf_post_t         *post;
100     ngx_array_t            **a;
101     ngx_regex_elt_t         *re;
102     ngx_regex_compile_t      rc;
103     ngx_uint_t               i, n = 0;
104     u_char                   errstr[NGX_MAX_CONF_ERRSTR];
105 
106     a = (ngx_array_t **) (p + cmd->offset);
107 
108     if (*a != NGX_CONF_UNSET_PTR) {
109 
110         n = cf->args->nelts > 4 ? cf->args->nelts : 4;
111 
112         *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));
113         if (*a == NULL) {
114             return  NGX_CONF_ERROR;
115         }
116     }
117 
118     ndk_zerov (rc);
119 
120     rc.pool = cf->pool;
121     rc.err.len = NGX_MAX_CONF_ERRSTR;
122     rc.err.data = errstr;
123 
124     value = cf->args->elts;
125     value++;
126 
127     for (i=0; i<n; i++, value++) {
128 
129         re = ngx_array_push (*a);
130         if (re == NULL)
131             return  NGX_CONF_ERROR;
132 
133         rc.pattern = *value;
134 
135         if (ngx_regex_compile(&rc) != NGX_OK) {
136             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
137             return NGX_CONF_ERROR;
138         }
139 
140         re->regex = rc.regex;
141         re->name = value->data;
142     }
143 
144 
145     if (cmd->post) {
146         post = cmd->post;
147         return  post->post_handler (cf, post, a);
148     }
149 
150     return  NGX_CONF_OK;
151 }
152 
153 
154 
155 char *
ndk_conf_set_regex_array_caseless_slot(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)156 ndk_conf_set_regex_array_caseless_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
157 {
158     char  *p = conf;
159 
160     ngx_str_t               *value;
161     ngx_conf_post_t         *post;
162     ngx_array_t            **a;
163     ngx_regex_elt_t         *re;
164     ngx_regex_compile_t      rc;
165     ngx_uint_t               i, n = 0;
166     u_char                   errstr[NGX_MAX_CONF_ERRSTR];
167 
168     a = (ngx_array_t **) (p + cmd->offset);
169 
170     if (*a != NGX_CONF_UNSET_PTR) {
171 
172         n = cf->args->nelts > 4 ? cf->args->nelts : 4;
173 
174         *a = ngx_array_create (cf->pool, n, sizeof (ngx_regex_elt_t));
175         if (*a == NULL) {
176             return  NGX_CONF_ERROR;
177         }
178     }
179 
180     ndk_zerov (rc);
181 
182     rc.pool = cf->pool;
183     rc.err.len = NGX_MAX_CONF_ERRSTR;
184     rc.err.data = errstr;
185 
186     value = cf->args->elts;
187     value++;
188 
189     for (i=0; i<n; i++, value++) {
190 
191         re = ngx_array_push (*a);
192         if (re == NULL)
193             return  NGX_CONF_ERROR;
194 
195         rc.pattern = *value;
196         rc.options = NGX_REGEX_CASELESS;
197 
198         if (ngx_regex_compile(&rc) != NGX_OK) {
199             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
200             return NGX_CONF_ERROR;
201         }
202 
203         re->regex = rc.regex;
204         re->name = value->data;
205     }
206 
207 
208     if (cmd->post) {
209         post = cmd->post;
210         return  post->post_handler (cf, post, a);
211     }
212 
213     return  NGX_CONF_OK;
214 }
215 
216