Mercurial > hg > nginx
comparison src/http/modules/ngx_http_geo_module.c @ 2442:6978f3827a5c
*) fix duplicate geo ranges
*) split existent range and insert a new one
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 16 Jan 2009 13:17:12 +0000 |
parents | 39f3b4f9989e |
children | 3d868fc44879 |
comparison
equal
deleted
inserted
replaced
2441:0c117a89f399 | 2442:6978f3827a5c |
---|---|
565 range = a->elts; | 565 range = a->elts; |
566 | 566 |
567 ngx_memcpy(&range[i + 2], &range[i + 1], | 567 ngx_memcpy(&range[i + 2], &range[i + 1], |
568 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); | 568 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); |
569 | 569 |
570 range = &range[i + 1]; | 570 range[i + 1].start = (u_short) s; |
571 range[i + 1].end = (u_short) e; | |
572 range[i + 1].value = ctx->value; | |
571 | 573 |
572 goto next; | 574 goto next; |
573 } | 575 } |
574 | 576 |
575 if (s == (ngx_uint_t) range[i].start | 577 if (s == (ngx_uint_t) range[i].start |
576 && e == (ngx_uint_t) range[i].end) | 578 && e == (ngx_uint_t) range[i].end) |
577 { | 579 { |
578 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | 580 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, |
579 "duplicate range \"%V\", value: \"%v\", old value: \"%v\"", | 581 "duplicate range \"%V\", value: \"%v\", old value: \"%v\"", |
580 ctx->net, ctx->value, range[i].value); | 582 ctx->net, ctx->value, range[i].value); |
581 continue; | 583 |
584 range[i].value = ctx->value; | |
585 | |
586 goto next; | |
587 } | |
588 | |
589 if (s > (ngx_uint_t) range[i].start | |
590 && e < (ngx_uint_t) range[i].end) | |
591 { | |
592 /* split the range and insert the new one */ | |
593 | |
594 range = ngx_array_push(a); | |
595 if (range == NULL) { | |
596 return NGX_CONF_ERROR; | |
597 } | |
598 | |
599 range = ngx_array_push(a); | |
600 if (range == NULL) { | |
601 return NGX_CONF_ERROR; | |
602 } | |
603 | |
604 range = a->elts; | |
605 | |
606 ngx_memcpy(&range[i + 3], &range[i + 1], | |
607 (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t)); | |
608 | |
609 range[i + 2].start = (u_short) (e + 1); | |
610 range[i + 2].end = range[i].end; | |
611 range[i + 2].value = range[i].value; | |
612 | |
613 range[i].end = (u_short) (s - 1); | |
614 | |
615 range[i + 1].start = (u_short) s; | |
616 range[i + 1].end = (u_short) e; | |
617 range[i + 1].value = ctx->value; | |
618 | |
619 goto next; | |
582 } | 620 } |
583 | 621 |
584 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 622 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
585 "overlapped range \"%V\"", ctx->net); | 623 "overlapped range \"%V\"", ctx->net); |
586 | 624 |
592 range = ngx_array_push(a); | 630 range = ngx_array_push(a); |
593 if (range == NULL) { | 631 if (range == NULL) { |
594 return NGX_CONF_ERROR; | 632 return NGX_CONF_ERROR; |
595 } | 633 } |
596 | 634 |
597 next: | |
598 | |
599 range->start = (u_short) s; | 635 range->start = (u_short) s; |
600 range->end = (u_short) e; | 636 range->end = (u_short) e; |
601 range->value = ctx->value; | 637 range->value = ctx->value; |
638 | |
639 next: | |
640 | |
641 continue; | |
602 } | 642 } |
603 | 643 |
604 return NGX_CONF_OK; | 644 return NGX_CONF_OK; |
605 } | 645 } |
606 | 646 |