Mercurial > hg > nginx-ranges
comparison src/http/modules/ngx_http_referer_module.c @ 578:f3a9e57d2e17
Merge with current.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 11 Mar 2010 21:27:17 +0300 |
parents | da3c99095432 |
children | 8246d8a2c2be |
comparison
equal
deleted
inserted
replaced
539:5f4de8cf0d9d | 578:f3a9e57d2e17 |
---|---|
122 } | 122 } |
123 | 123 |
124 len = r->headers_in.referer->value.len; | 124 len = r->headers_in.referer->value.len; |
125 ref = r->headers_in.referer->value.data; | 125 ref = r->headers_in.referer->value.data; |
126 | 126 |
127 if (len < sizeof("http://i.ru") - 1 | 127 if (len >= sizeof("http://i.ru") - 1) { |
128 || (ngx_strncasecmp(ref, (u_char *) "http://", 7) != 0)) | 128 last = ref + len; |
129 { | 129 |
130 if (rlcf->blocked_referer) { | 130 if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) { |
131 goto valid; | 131 ref += 7; |
132 } | 132 goto valid_scheme; |
133 | 133 |
134 goto invalid; | 134 } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) { |
135 } | 135 ref += 8; |
136 | 136 goto valid_scheme; |
137 last = ref + len; | 137 } |
138 ref += 7; | 138 } |
139 | |
140 if (rlcf->blocked_referer) { | |
141 goto valid; | |
142 } | |
143 | |
144 goto invalid; | |
145 | |
146 valid_scheme: | |
147 | |
139 i = 0; | 148 i = 0; |
140 key = 0; | 149 key = 0; |
141 | 150 |
142 for (p = ref; p < last; p++) { | 151 for (p = ref; p < last; p++) { |
143 if (*p == '/' || *p == ':') { | 152 if (*p == '/' || *p == ':') { |
410 | 419 |
411 #if (NGX_PCRE) | 420 #if (NGX_PCRE) |
412 if (sn[n].regex) { | 421 if (sn[n].regex) { |
413 | 422 |
414 if (ngx_http_add_regex_referer(cf, rlcf, &sn[n].name, | 423 if (ngx_http_add_regex_referer(cf, rlcf, &sn[n].name, |
415 sn[n].regex) | 424 sn[n].regex->regex) |
416 != NGX_OK) | 425 != NGX_OK) |
417 { | 426 { |
418 return NGX_CONF_ERROR; | 427 return NGX_CONF_ERROR; |
419 } | 428 } |
420 | 429 |
500 static char * | 509 static char * |
501 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, | 510 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, |
502 ngx_str_t *name, ngx_regex_t *regex) | 511 ngx_str_t *name, ngx_regex_t *regex) |
503 { | 512 { |
504 #if (NGX_PCRE) | 513 #if (NGX_PCRE) |
505 ngx_str_t err; | 514 ngx_regex_elt_t *re; |
506 ngx_regex_elt_t *re; | 515 ngx_regex_compile_t rc; |
507 u_char errstr[NGX_MAX_CONF_ERRSTR]; | 516 u_char errstr[NGX_MAX_CONF_ERRSTR]; |
508 | 517 |
509 if (name->len == 1) { | 518 if (name->len == 1) { |
510 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name); | 519 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name); |
511 return NGX_CONF_ERROR; | 520 return NGX_CONF_ERROR; |
512 } | 521 } |
528 re->name = name->data; | 537 re->name = name->data; |
529 | 538 |
530 return NGX_CONF_OK; | 539 return NGX_CONF_OK; |
531 } | 540 } |
532 | 541 |
533 err.len = NGX_MAX_CONF_ERRSTR; | |
534 err.data = errstr; | |
535 | |
536 name->len--; | 542 name->len--; |
537 name->data++; | 543 name->data++; |
538 | 544 |
539 re->regex = ngx_regex_compile(name, NGX_REGEX_CASELESS, cf->pool, &err); | 545 ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); |
540 | 546 |
541 if (re->regex == NULL) { | 547 rc.pattern = *name; |
542 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s", err.data); | 548 rc.pool = cf->pool; |
549 rc.options = NGX_REGEX_CASELESS; | |
550 rc.err.len = NGX_MAX_CONF_ERRSTR; | |
551 rc.err.data = errstr; | |
552 | |
553 if (ngx_regex_compile(&rc) != NGX_OK) { | |
554 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err); | |
543 return NGX_CONF_ERROR; | 555 return NGX_CONF_ERROR; |
544 } | 556 } |
545 | 557 |
558 re->regex = rc.regex; | |
546 re->name = name->data; | 559 re->name = name->data; |
547 | 560 |
548 return NGX_CONF_OK; | 561 return NGX_CONF_OK; |
549 | 562 |
550 #else | 563 #else |