Mercurial > hg > nginx-vendor-0-7
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) |