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