Nes

 view release on metacpan or  search on metacpan

lib/Nes.pm  view on Meta::CPAN

      
      require IPC::Open3;
      my ( $writer, $reader, $error );   
      my $pid = IPC::Open3::open3( $writer, $reader, $error, "$self->{'CFG'}{'shell_cline'}" );
      print $writer $self->{'out'};
      close $writer;
      $self->{'out'} = '';
      while (<$reader>) {
        $self->{'out'} .= $_;
      }
      close $reader;
      waitpid( $pid, 0 );      
      
    }
    
    return;
  }

}


{ 

  package nes_php;
  use vars qw(@ISA);
  @ISA = qw( nes_content );

  sub new {
    my $class = shift;
    my ( $container ) = @_;
    my $self = $class->SUPER::new($container);

#    @{ $self->{'file_script'} } = @scripts;
    $self->{'Content-type'} = "Content-type: text/html";
    $self->{'is_binary'} = 0;
    $self->{'file_name'} = $self->{'container'}->{'file_name'};
    
    $self->{'php_wrapper'} = 0;
    $self->{'php_wrapper'} = 1 if $self->{'file_name'} eq $self->{'top_container'}->{'file'};
    
    # damos soporte a include PHP al método GET
    $self->{'start_script'} = '<?php parse_str($_SERVER[\'QUERY_STRING\'], $_GET); ?>'."\n";
    
    return ($self);
  }

  sub go {
    my $self  = shift;

    $self->SUPER::go() if !$self->{'php_wrapper'};

    my $cline       = $self->{'CFG'}{'php_cline'};
    $cline          = $self->{'CFG'}{'php_cgi_cline'} if $self->{'php_wrapper'};

    if ( $self->{'php_wrapper'} || $MOD_PERL ) {    
      # por seguridad 
      require Env::C;
      foreach (keys %ENV) {
        my $var = $ENV{$_};
        utl::no_nes_remove(\$var);
        Env::C::setenv( $_, $var );
      }
    }
    
    
    if ( $MOD_PERL ) {
      
      local $| = 1;
      require IPC::Run;
      
      my @command = split(' ', $cline );
      my ( $writer, $reader, $error );
      my $h = IPC::Run::start (\@command, \$writer, \$reader, \$error, IPC::Run::timeout( 30 ));

      if ( $self->{'php_wrapper'} ) {
        if ( $ENV{'REQUEST_METHOD'} ne 'GET' ) {
          if ( $self->{'query'}->{'save_buffer'} ) {
            # todo: es posible que esto consuma mucha memoria en POST grandes
            # $writer .= $buffer; sin IPC::Run::pump, pero haciendo pump da 
            # errores en mod_perl, comprobar
            while ( my $buffer = $self->{'query'}->get_buffer ) {
              $writer .= $buffer;
            }
          } else {
            $writer = $self->{'query'}->get_buffer_raw;
          }
        }
      } else {
        # include PHP no soporta el metodo POST, de momento
        $writer = $self->{'start_script'}.$self->{'out'};
      }    

      IPC::Run::pump $h;
      IPC::Run::finish $h;
      $self->{'out'} = $reader; 
      warn $error if $error; 

    } else {

      require IPC::Open3;
      my ( $writer, $reader, $error, $out_error );
      my $pid = IPC::Open3::open3( $writer, $reader, $error, $cline );
      
      binmode $writer;
      binmode $reader;

      if ( $self->{'php_wrapper'} ) {
        if ( $ENV{'REQUEST_METHOD'} ne 'GET' ) {
          if ( $self->{'query'}->{'save_buffer'} ) {
            while ( my $buffer = $self->{'query'}->get_buffer ) {
              print $writer $buffer;
            }
          } else {
            print $writer $self->{'query'}->get_buffer_raw;
          }
        }
      } else {
        # include PHP no soporta el metodo POST
        print $writer $self->{'start_script'}.$self->{'out'};
      }
      close $writer;



( run in 0.779 second using v1.01-cache-2.11-cpan-7fcb06a456a )