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, &regex[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