Mercurial > hg > nginx
comparison src/http/modules/ngx_http_referer_module.c @ 1785:0673b54f34f7
use ngx_regex_exec_array()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 27 Dec 2007 13:15:43 +0000 |
parents | db07cb9d1cbc |
children | 3e1c695258d3 |
comparison
equal
deleted
inserted
replaced
1784:7d313324d874 | 1785:0673b54f34f7 |
---|---|
9 #include <ngx_http.h> | 9 #include <ngx_http.h> |
10 | 10 |
11 | 11 |
12 #define NGX_HTTP_REFERER_NO_URI_PART ((void *) 4) | 12 #define NGX_HTTP_REFERER_NO_URI_PART ((void *) 4) |
13 | 13 |
14 #if (NGX_PCRE) | 14 #if !(NGX_PCRE) |
15 | |
16 typedef struct { | |
17 ngx_regex_t *regex; | |
18 ngx_str_t name; | |
19 } ngx_http_referer_regex_t; | |
20 | |
21 #else | |
22 | 15 |
23 #define ngx_regex_t void | 16 #define ngx_regex_t void |
24 | 17 |
25 #endif | 18 #endif |
26 | 19 |
166 } | 159 } |
167 | 160 |
168 #if (NGX_PCRE) | 161 #if (NGX_PCRE) |
169 | 162 |
170 if (rlcf->regex) { | 163 if (rlcf->regex) { |
171 ngx_int_t n; | 164 ngx_int_t rc; |
172 ngx_str_t referer; | 165 ngx_str_t referer; |
173 ngx_http_referer_regex_t *regex; | |
174 | 166 |
175 referer.len = len - 7; | 167 referer.len = len - 7; |
176 referer.data = ref; | 168 referer.data = ref; |
177 | 169 |
178 regex = rlcf->regex->elts; | 170 rc = ngx_regex_exec_array(rlcf->regex, &referer, r->connection->log); |
179 | 171 |
180 for (i = 0; i < rlcf->regex->nelts; i++) { | 172 if (rc == NGX_OK) { |
181 n = ngx_regex_exec(regex[i].regex, &referer, NULL, 0); | |
182 | |
183 if (n == NGX_REGEX_NO_MATCHED) { | |
184 continue; | |
185 } | |
186 | |
187 if (n < 0) { | |
188 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | |
189 ngx_regex_exec_n | |
190 " failed: %d on \"%V\" using \"%V\"", | |
191 n, &referer, ®ex[i].name); | |
192 return NGX_ERROR; | |
193 } | |
194 | |
195 /* match */ | |
196 | |
197 goto valid; | 173 goto valid; |
198 } | 174 } |
175 | |
176 if (rc == NGX_ERROR) { | |
177 return rc; | |
178 } | |
179 | |
180 /* NGX_DECLINED */ | |
199 } | 181 } |
200 | 182 |
201 #endif | 183 #endif |
202 | 184 |
203 invalid: | 185 invalid: |
514 static char * | 496 static char * |
515 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, | 497 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, |
516 ngx_str_t *name, ngx_regex_t *regex) | 498 ngx_str_t *name, ngx_regex_t *regex) |
517 { | 499 { |
518 #if (NGX_PCRE) | 500 #if (NGX_PCRE) |
519 ngx_str_t err; | 501 ngx_str_t err; |
520 ngx_http_referer_regex_t *rr; | 502 ngx_regex_elt_t *re; |
521 u_char errstr[NGX_MAX_CONF_ERRSTR]; | 503 u_char errstr[NGX_MAX_CONF_ERRSTR]; |
522 | 504 |
523 if (rlcf->regex == NGX_CONF_UNSET_PTR) { | 505 if (rlcf->regex == NGX_CONF_UNSET_PTR) { |
524 rlcf->regex = ngx_array_create(cf->pool, 2, | 506 rlcf->regex = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t)); |
525 sizeof(ngx_http_referer_regex_t)); | |
526 if (rlcf->regex == NULL) { | 507 if (rlcf->regex == NULL) { |
527 return NGX_CONF_ERROR; | 508 return NGX_CONF_ERROR; |
528 } | 509 } |
529 } | 510 } |
530 | 511 |
531 rr = ngx_array_push(rlcf->regex); | 512 re = ngx_array_push(rlcf->regex); |
532 if (rr == NULL) { | 513 if (re == NULL) { |
533 return NGX_CONF_ERROR; | 514 return NGX_CONF_ERROR; |
534 } | 515 } |
535 | 516 |
536 if (regex) { | 517 if (regex) { |
537 rr->regex = regex; | 518 re->regex = regex; |
538 rr->name = *name; | 519 re->name = name->data; |
539 | 520 |
540 return NGX_CONF_OK; | 521 return NGX_CONF_OK; |
541 } | 522 } |
542 | 523 |
543 err.len = NGX_MAX_CONF_ERRSTR; | 524 err.len = NGX_MAX_CONF_ERRSTR; |
544 err.data = errstr; | 525 err.data = errstr; |
545 | 526 |
546 name->len--; | 527 name->len--; |
547 name->data++; | 528 name->data++; |
548 | 529 |
549 rr->regex = ngx_regex_compile(name, NGX_REGEX_CASELESS, cf->pool, &err); | 530 re->regex = ngx_regex_compile(name, NGX_REGEX_CASELESS, cf->pool, &err); |
550 | 531 |
551 if (rr->regex == NULL) { | 532 if (re->regex == NULL) { |
552 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s", err.data); | 533 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s", err.data); |
553 return NGX_CONF_ERROR; | 534 return NGX_CONF_ERROR; |
554 } | 535 } |
555 | 536 |
556 rr->name = *name; | 537 re->name = name->data; |
557 | 538 |
558 return NGX_CONF_OK; | 539 return NGX_CONF_OK; |
559 | 540 |
560 #else | 541 #else |
561 | 542 |