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