Mercurial > hg > nginx
comparison src/http/modules/ngx_http_ssi_filter.c @ 489:45a460f82aec release-0.1.19
nginx-0.1.19-RELEASE import
*) Bugfix: now, if request contains the zero, then the 404 error is
returned for the local requests.
*) Bugfix: nginx could not be built on NetBSD 2.0.
*) Bugfix: the timeout may occur while reading of the the client
request body via SSL connections.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 16 Feb 2005 13:40:36 +0000 |
parents | 42d11f017717 |
children | d7c90bb5ce83 |
comparison
equal
deleted
inserted
replaced
488:24c8dcb960fd | 489:45a460f82aec |
---|---|
516 } | 516 } |
517 | 517 |
518 #endif | 518 #endif |
519 | 519 |
520 | 520 |
521 static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r, | 521 static ngx_int_t |
522 ngx_http_ssi_ctx_t *ctx) | 522 ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) |
523 { | 523 { |
524 char *p, *last, *end, ch; | 524 u_char *p, *last, *end, ch; |
525 ngx_http_ssi_conf_t *conf; | 525 ngx_http_ssi_conf_t *conf; |
526 ngx_http_ssi_state_e state; | 526 ngx_http_ssi_state_e state; |
527 | 527 |
528 conf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module); | 528 conf = ngx_http_get_module_loc_conf(r, ngx_http_ssi_filter_module); |
529 | 529 |
530 state = ctx->state; | 530 state = ctx->state; |
531 p = ctx->pos; | |
532 end = ctx->buf->last; | 531 end = ctx->buf->last; |
533 last = NULL; | 532 last = NULL; |
534 | 533 |
535 while (p < end) { | 534 for (p = ctx->pos; p < end; p++) { |
536 ch = *p++; | 535 |
536 ch = *p; | |
537 | |
538 if (state == ssi_start_state) { | |
539 | |
540 /* the tight loop */ | |
541 | |
542 for ( /* void */ ; p < end; p++) { | |
543 if (ch != '<') { | |
544 continue; | |
545 } | |
546 | |
547 last = p; | |
548 state = ssi_tag_state; | |
549 break; | |
550 } | |
551 | |
552 if (p == end) { | |
553 ctx->last = p; | |
554 ctx->pos = p; | |
555 ctx->state = ssi_start_state; | |
556 | |
557 return NGX_HTTP_SSI_COPY; | |
558 } | |
559 } | |
537 | 560 |
538 switch (state) { | 561 switch (state) { |
539 | 562 |
540 case ssi_start_state: | 563 case ssi_start_state: |
541 | |
542 /* a tight loop */ | |
543 | |
544 for ( ;; ) { | |
545 | |
546 if (ch == '<') { | |
547 last = p - 1; | |
548 state = ssi_tag_state; | |
549 break; | |
550 } | |
551 | |
552 if (p == end) { | |
553 ctx->last = p; | |
554 ctx->pos = p; | |
555 ctx->state = ssi_start_state; | |
556 | |
557 return NGX_HTTP_SSI_COPY; | |
558 } | |
559 | |
560 ch = *p++; | |
561 } | |
562 | |
563 break; | 564 break; |
564 | 565 |
565 case ssi_tag_state: | 566 case ssi_tag_state: |
566 switch (ch) { | 567 switch (ch) { |
567 case '!': | 568 case '!': |
568 state = ssi_comment0_state; | 569 state = ssi_comment0_state; |
569 break; | 570 break; |
570 | 571 |
571 case '<': | 572 case '<': |
572 last = p - 1; | 573 last = p; |
573 break; | 574 break; |
574 | 575 |
575 default: | 576 default: |
576 state = ssi_start_state; | 577 state = ssi_start_state; |
577 break; | 578 break; |
584 case '-': | 585 case '-': |
585 state = ssi_comment1_state; | 586 state = ssi_comment1_state; |
586 break; | 587 break; |
587 | 588 |
588 case '<': | 589 case '<': |
589 last = p - 1; | 590 last = p; |
590 state = ssi_tag_state; | 591 state = ssi_tag_state; |
591 break; | 592 break; |
592 | 593 |
593 default: | 594 default: |
594 state = ssi_start_state; | 595 state = ssi_start_state; |
602 case '-': | 603 case '-': |
603 state = ssi_sharp_state; | 604 state = ssi_sharp_state; |
604 break; | 605 break; |
605 | 606 |
606 case '<': | 607 case '<': |
607 last = p - 1; | 608 last = p; |
608 state = ssi_tag_state; | 609 state = ssi_tag_state; |
609 break; | 610 break; |
610 | 611 |
611 default: | 612 default: |
612 state = ssi_start_state; | 613 state = ssi_start_state; |
619 switch (ch) { | 620 switch (ch) { |
620 case '#': | 621 case '#': |
621 ctx->last = last; | 622 ctx->last = last; |
622 ctx->pos = p; | 623 ctx->pos = p; |
623 ctx->state = ssi_precommand_state; | 624 ctx->state = ssi_precommand_state; |
624 | 625 break; |
625 return NGX_HTTP_SSI_COPY; | |
626 | 626 |
627 case '<': | 627 case '<': |
628 last = p - 1; | 628 last = p; |
629 state = ssi_tag_state; | 629 state = ssi_tag_state; |
630 break; | 630 break; |
631 | 631 |
632 default: | 632 default: |
633 state = ssi_start_state; | 633 state = ssi_start_state; |
643 case LF: | 643 case LF: |
644 case '\t': | 644 case '\t': |
645 break; | 645 break; |
646 | 646 |
647 default: | 647 default: |
648 ctx->command.len = 1; | |
648 ctx->command.data = | 649 ctx->command.data = |
649 ngx_palloc(r->pool, NGX_HTTP_SSI_COMMAND_LEN + 1); | 650 ngx_palloc(r->pool, NGX_HTTP_SSI_COMMAND_LEN); |
650 if (ctx->command.data == NULL) { | 651 if (ctx->command.data == NULL) { |
651 return NGX_ERROR; | 652 return NGX_ERROR; |
652 } | 653 } |
653 | 654 |
654 ctx->command.data[0] = ch; | 655 ctx->command.data[0] = ch; |
655 ctx->command.len = 1; | |
656 state = ssi_command_state; | 656 state = ssi_command_state; |
657 break; | 657 break; |
658 } | 658 } |
659 | 659 |
660 break; | 660 break; |
663 switch (ch) { | 663 switch (ch) { |
664 case ' ': | 664 case ' ': |
665 case CR: | 665 case CR: |
666 case LF: | 666 case LF: |
667 case '\t': | 667 case '\t': |
668 ctx->command.data[ctx->command.len] = 0; | |
669 state = ssi_preparam_state; | 668 state = ssi_preparam_state; |
670 break; | 669 break; |
671 | 670 |
672 case '-': | 671 case '-': |
673 ctx->command.data[ctx->command.len] = 0; | |
674 state = ssi_comment_end0_state; | 672 state = ssi_comment_end0_state; |
675 break; | 673 break; |
676 | 674 |
677 default: | 675 default: |
678 if (ctx->command.len >= NGX_HTTP_SSI_COMMAND_LEN) { | 676 if (ctx->command.len == NGX_HTTP_SSI_COMMAND_LEN) { |
679 ctx->command.data[NGX_HTTP_SSI_COMMAND_LEN] = 0; | |
680 | |
681 ctx->last = last; | |
682 ctx->pos = p; | 677 ctx->pos = p; |
683 ctx->state = ssi_error_state; | 678 ctx->state = ssi_error_state; |
684 | 679 |
685 return NGX_HTTP_SSI_INVALID_COMMAND; | 680 return NGX_HTTP_SSI_INVALID_COMMAND; |
686 } | 681 } |
702 state = ssi_comment_end0_state; | 697 state = ssi_comment_end0_state; |
703 break; | 698 break; |
704 | 699 |
705 default: | 700 default: |
706 if (ctx->params.elts == NULL) { | 701 if (ctx->params.elts == NULL) { |
707 ngx_init_array(ctx->params, r->pool, | 702 if (ngx_array_init(&ctx->params = r->pool, |
708 5, sizeof(ngx_table_elt_t), NGX_ERROR); | 703 4, sizeof(ngx_table_elt_t)) = NGX_ERROR) |
709 } | 704 { |
710 | 705 return NGX_ERROR; |
711 if (!(ctx->param = ngx_push_array(&ctx->params))) { | 706 } |
707 } | |
708 | |
709 if (!(ctx->param = ngx_array_push(&ctx->params))) { | |
712 return NGX_ERROR; | 710 return NGX_ERROR; |
713 } | 711 } |
714 | 712 |
713 ctx->param->key.len = 1; | |
715 ctx->param->key.data = | 714 ctx->param->key.data = |
716 ngx_palloc(r->pool, NGX_HTTP_SSI_PARAM_LEN + 1); | 715 ngx_palloc(r->pool, NGX_HTTP_SSI_PARAM_LEN); |
717 if (ctx->param->key.data == NULL) { | 716 if (ctx->param->key.data == NULL) { |
718 return NGX_ERROR; | 717 return NGX_ERROR; |
719 } | 718 } |
720 ctx->param->key.data[0] = ch; | 719 ctx->param->key.data[0] = ch; |
721 ctx->param->key.len = 1; | 720 |
722 | 721 ctx->param->value.len = 0; |
723 ctx->param->value.data = | 722 ctx->param->value.data = ngx_palloc(r->pool, conf->value_len); |
724 ngx_palloc(r->pool, conf->value_len + 1); | |
725 if (ctx->param->value.data == NULL) { | 723 if (ctx->param->value.data == NULL) { |
726 return NGX_ERROR; | 724 return NGX_ERROR; |
727 } | 725 } |
728 ctx->param->value.len = 0; | |
729 | 726 |
730 state = ssi_param_state; | 727 state = ssi_param_state; |
731 break; | 728 break; |
732 } | 729 } |
733 | 730 |
737 switch (ch) { | 734 switch (ch) { |
738 case ' ': | 735 case ' ': |
739 case CR: | 736 case CR: |
740 case LF: | 737 case LF: |
741 case '\t': | 738 case '\t': |
742 ctx->param->key.data[ctx->param->key.len] = 0; | |
743 state = ssi_preequal_state; | 739 state = ssi_preequal_state; |
744 break; | 740 break; |
745 | 741 |
746 case '=': | 742 case '=': |
747 ctx->param->key.data[ctx->param->key.len] = 0; | |
748 state = ssi_prevalue_state; | 743 state = ssi_prevalue_state; |
749 break; | 744 break; |
750 | 745 |
751 case '-': | 746 case '-': |
752 ctx->last = last; | |
753 ctx->pos = p; | 747 ctx->pos = p; |
754 ctx->state = ssi_error_end0_state; | 748 ctx->state = ssi_error_end0_state; |
755 | 749 |
756 return NGX_HTTP_SSI_INVALID_PARAM; | 750 return NGX_HTTP_SSI_INVALID_PARAM; |
757 | 751 |
758 default: | 752 default: |
759 if (ctx->param->key.len >= NGX_HTTP_SSI_PARAM_LEN) { | 753 if (ctx->param->key.len == NGX_HTTP_SSI_PARAM_LEN) { |
760 ctx->param->key.data[NGX_HTTP_SSI_PARAM_LEN] = 0; | |
761 | |
762 ctx->last = last; | |
763 ctx->pos = p; | 754 ctx->pos = p; |
764 ctx->state = ssi_error_state; | 755 ctx->state = ssi_error_state; |
765 | 756 |
766 return NGX_HTTP_SSI_INVALID_PARAM; | 757 return NGX_HTTP_SSI_INVALID_PARAM; |
767 } | 758 } |
782 case '=': | 773 case '=': |
783 state = ssi_prevalue_state; | 774 state = ssi_prevalue_state; |
784 break; | 775 break; |
785 | 776 |
786 case '-': | 777 case '-': |
787 ctx->last = last; | |
788 ctx->pos = p; | 778 ctx->pos = p; |
789 ctx->state = ssi_error_end0_state; | 779 ctx->state = ssi_error_end0_state; |
790 | 780 |
791 return NGX_HTTP_SSI_INVALID_PARAM; | 781 return NGX_HTTP_SSI_INVALID_PARAM; |
792 | 782 |