comparison src/http/modules/ngx_http_geo_module.c @ 438:ce4f9ff90bfa NGINX_0_7_31

nginx 0.7.31 *) Change: now the "try_files" directive tests files only and ignores directories. *) Feature: the "fastcgi_split_path_info" directive. *) Bugfixes in an "Expect" request header line support. *) Bugfixes in geo ranges. *) Bugfix: in a miss case ngx_http_memcached_module returned the "END" line as response body instead of default 404 page body; the bug had appeared in 0.7.18. Thanks to Maxim Dounin. *) Bugfix: while SMTP proxying nginx issued message "250 2.0.0 OK" instead of "235 2.0.0 OK"; the bug had appeared in 0.7.22. Thanks to Maxim Dounin.
author Igor Sysoev <http://sysoev.ru>
date Mon, 19 Jan 2009 00:00:00 +0300
parents dac47e9ef0d5
children 6281966854a5
comparison
equal deleted inserted replaced
437:5da91f7cde93 438:ce4f9ff90bfa
516 in_addr_t n; 516 in_addr_t n;
517 ngx_uint_t h, i, s, e; 517 ngx_uint_t h, i, s, e;
518 ngx_array_t *a; 518 ngx_array_t *a;
519 ngx_http_geo_range_t *range; 519 ngx_http_geo_range_t *range;
520 520
521 for (n = start; n < end; n += 0x10000) { 521 for (n = start; n <= end; n += 0x10000) {
522 522
523 h = n >> 16; 523 h = n >> 16;
524 s = n & 0xffff; 524
525 if (n == start) {
526 s = n & 0xffff;
527 } else {
528 s = 0;
529 }
525 530
526 if ((n | 0xffff) > end) { 531 if ((n | 0xffff) > end) {
527 e = end & 0xffff; 532 e = end & 0xffff;
528 533
529 } else { 534 } else {
565 range = a->elts; 570 range = a->elts;
566 571
567 ngx_memcpy(&range[i + 2], &range[i + 1], 572 ngx_memcpy(&range[i + 2], &range[i + 1],
568 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); 573 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
569 574
570 range = &range[i + 1]; 575 range[i + 1].start = (u_short) s;
576 range[i + 1].end = (u_short) e;
577 range[i + 1].value = ctx->value;
571 578
572 goto next; 579 goto next;
573 } 580 }
574 581
575 if (s == (ngx_uint_t) range[i].start 582 if (s == (ngx_uint_t) range[i].start
576 && e == (ngx_uint_t) range[i].end) 583 && e == (ngx_uint_t) range[i].end)
577 { 584 {
578 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, 585 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
579 "duplicate range \"%V\", value: \"%v\", old value: \"%v\"", 586 "duplicate range \"%V\", value: \"%v\", old value: \"%v\"",
580 ctx->net, ctx->value, range[i].value); 587 ctx->net, ctx->value, range[i].value);
581 continue; 588
582 } 589 range[i].value = ctx->value;
590
591 goto next;
592 }
593
594 if (s > (ngx_uint_t) range[i].start
595 && e < (ngx_uint_t) range[i].end)
596 {
597 /* split the range and insert the new one */
598
599 range = ngx_array_push(a);
600 if (range == NULL) {
601 return NGX_CONF_ERROR;
602 }
603
604 range = ngx_array_push(a);
605 if (range == NULL) {
606 return NGX_CONF_ERROR;
607 }
608
609 range = a->elts;
610
611 ngx_memcpy(&range[i + 3], &range[i + 1],
612 (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t));
613
614 range[i + 2].start = (u_short) (e + 1);
615 range[i + 2].end = range[i].end;
616 range[i + 2].value = range[i].value;
617
618 range[i + 1].start = (u_short) s;
619 range[i + 1].end = (u_short) e;
620 range[i + 1].value = ctx->value;
621
622 range[i].end = (u_short) (s - 1);
623
624 goto next;
625 }
626
627 if (s == (ngx_uint_t) range[i].start
628 && e < (ngx_uint_t) range[i].end)
629 {
630 /* shift the range start and insert the new range */
631
632 range = ngx_array_push(a);
633 if (range == NULL) {
634 return NGX_CONF_ERROR;
635 }
636
637 range = a->elts;
638
639 ngx_memcpy(&range[i + 2], &range[i + 1],
640 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
641
642 range[i + 1].start = (u_short) (e + 1);
643
644 range[i].start = (u_short) s;
645 range[i].end = (u_short) e;
646 range[i].value = ctx->value;
647
648 goto next;
649 }
650
651 if (s > (ngx_uint_t) range[i].start
652 && e == (ngx_uint_t) range[i].end)
653 {
654 /* shift the range end and insert the new range */
655
656 range = ngx_array_push(a);
657 if (range == NULL) {
658 return NGX_CONF_ERROR;
659 }
660
661 range = a->elts;
662
663 ngx_memcpy(&range[i + 2], &range[i + 1],
664 (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
665
666 range[i + 1].start = (u_short) s;
667 range[i + 1].end = (u_short) e;
668 range[i + 1].value = ctx->value;
669
670 range[i].end = (u_short) (s - 1);
671
672 goto next;
673 }
674
675 s = (ngx_uint_t) range[i].start;
676 e = (ngx_uint_t) range[i].end;
583 677
584 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 678 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
585 "overlapped range \"%V\"", ctx->net); 679 "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"",
680 ctx->net,
681 h >> 8, h & 0xff, s >> 8, s & 0xff,
682 h >> 8, h & 0xff, e >> 8, e & 0xff);
586 683
587 return NGX_CONF_ERROR; 684 return NGX_CONF_ERROR;
588 } 685 }
589 686
590 /* add the first range */ 687 /* add the first range */
592 range = ngx_array_push(a); 689 range = ngx_array_push(a);
593 if (range == NULL) { 690 if (range == NULL) {
594 return NGX_CONF_ERROR; 691 return NGX_CONF_ERROR;
595 } 692 }
596 693
597 next:
598
599 range->start = (u_short) s; 694 range->start = (u_short) s;
600 range->end = (u_short) e; 695 range->end = (u_short) e;
601 range->value = ctx->value; 696 range->value = ctx->value;
697
698 next:
699
700 continue;
602 } 701 }
603 702
604 return NGX_CONF_OK; 703 return NGX_CONF_OK;
605 } 704 }
606 705
614 ngx_array_t *a; 713 ngx_array_t *a;
615 ngx_http_geo_range_t *range; 714 ngx_http_geo_range_t *range;
616 715
617 warn = 0; 716 warn = 0;
618 717
619 for (n = start; n < end; n += 0x10000) { 718 for (n = start; n <= end; n += 0x10000) {
620 719
621 h = n >> 16; 720 h = n >> 16;
622 s = n & 0xffff; 721
722 if (n == start) {
723 s = n & 0xffff;
724 } else {
725 s = 0;
726 }
623 727
624 if ((n | 0xffff) > end) { 728 if ((n | 0xffff) > end) {
625 e = end & 0xffff; 729 e = end & 0xffff;
626 730
627 } else { 731 } else {
641 if (s == (ngx_uint_t) range[i].start 745 if (s == (ngx_uint_t) range[i].start
642 && e == (ngx_uint_t) range[i].end) 746 && e == (ngx_uint_t) range[i].end)
643 { 747 {
644 ngx_memcpy(&range[i], &range[i + 1], 748 ngx_memcpy(&range[i], &range[i + 1],
645 (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t)); 749 (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t));
750
751 a->nelts--;
752
646 break; 753 break;
647 } 754 }
648 755
649 if (s != (ngx_uint_t) range[i].start 756 if (s != (ngx_uint_t) range[i].start
650 && e != (ngx_uint_t) range[i].end) 757 && e != (ngx_uint_t) range[i].end)