Apache-SSI

 view release on metacpan or  search on metacpan

lib/Apache/SSI.pm  view on Meta::CPAN

    if (lc($r->dir_config('Filter')) eq 'on') {
        $r = $r->filter_register;
        my ($status);
        ($fh, $status) = $r->filter_input();
        return $status unless $status == OK;
        
    } else {
        my $file = $r->filename;

        unless (-e $file) {
	#unless (-e $r->finfo) {
            $r->log_error("$file not found");
            return NOT_FOUND;
        }

        $fh = gensym;
        unless (open *{$fh}, $file) {
            $r->log_error("$file: $!");
            return FORBIDDEN;
        }
    }
    $r->send_http_header;
    return OK if $r->header_only;
    
    do {local $/=undef; $pack->new( scalar(<$fh>), $r )}->output;
    return OK;
}

sub new {
  my ($pack, $text, $r) = @_;
  $pack = ref($pack) if ref($pack);
  
  return bless 
    {
     'text' => $text,
     '_r'   => $r,
     'suspend' => [0],
     'if_state' => [1], # A stack reflecting the current state of if/else parser.
                        # Each entry is 1 when we've seen a true condition in this if-chain,
                        # 0 when we haven't.  Initially it's as if we're in a big true 
                        # if-block with no else.
     'errmsg'  => "[an error occurred while processing this directive]",
     'sizefmt' => 'abbrev',
     'timefmt' => undef, # undef means the current locale's default
    }, $pack;
}

sub text {
    my $self = shift;
    if (@_) {
        $self->{'text'} = shift;
    }
    return $self->{'text'};
}

sub get_output {
    my $self = shift;
    
    my $out = '';
    my $ssi;
    my @parts = split m/(<!--#.*?-->)/s, $self->{'text'};
    while (@parts) {
        $out .= ('', shift @parts)[1-$self->{'suspend'}[0]];
        last unless @parts;
        $ssi = shift @parts;
        # There's some weird 'uninitialized' warning on the next line, but I can't find it.
        if ($ssi =~ m/^<!--#(.*)-->$/s) {
            $out .= $self->output_ssi($1);
        } else { die 'Parse error' }
    }
    return $out;
}


sub output {
    my $self = shift;
    
    my @parts = split m/(<!--#.*?-->)/s, $self->{'text'};
    while (@parts) {
        $self->{_r}->print( ('', shift @parts)[1-$self->{'suspend'}[0]] );
        last unless @parts;
        my $ssi = shift @parts;
        if ($ssi =~ m/^<!--#(.*)-->$/s) {
            $self->{_r}->print( $self->output_ssi($1) );
        } else { die 'Parse error' }
    }
}

sub output_ssi {
    my ($self, $text) = @_;
    
    if ($text =~ s/^(\w+)\s*//) {
        my $tag = $1;
        return if ($self->{'suspend'}[0] and not $tag =~ /^(if|elif|else|endif)/);
        my $method = lc "ssi_$tag";

	local $HTML::SimpleParse::FIX_CASE = -1;
        my $args = [ HTML::SimpleParse->parse_args($text) ];
        return $self->$method( {@$args}, $args );
    }
    return '';
}

sub ssi_if {
    my ($self, $args) = @_;
    unshift @{$self->{if_state}}, 0;
    unshift @{$self->{suspend}},  $self->{suspend}[0];
    return '' if $self->{suspend}[0];
    return $self->_handle_ifs( $self->_eval_vars($args->{'expr'}) );
}

sub ssi_elif {
    my ($self, $args) = @_;
    # Make sure we're in an 'if' chain
    return $self->error("Malformed if..endif SSI structure") unless @{$self->{if_state}} > 1;
    return '' if $self->{suspend}[1];
    return $self->_handle_ifs( $self->_eval_vars($args->{'expr'}) );
}

sub ssi_else {
    my $self = shift;
    # Make sure we're in an 'if' chain
    return $self->error("Malformed if..endif SSI structure") unless @{$self->{if_state}} > 1;
    return '' if $self->{suspend}[1];
    return $self->_handle_ifs(1);
}

sub ssi_endif {
    my $self = shift;
    # Make sure we're in an 'if' chain
    return $self->error("Malformed if..endif SSI structure") unless @{$self->{if_state}} > 1;
    shift @{$self->{if_state}};
    shift @{$self->{suspend}};
    return '';
}

sub _handle_ifs {
    my $self = shift;



( run in 1.638 second using v1.01-cache-2.11-cpan-39bf76dae61 )