uHTML

 view release on metacpan or  search on metacpan

uHTML/request.pm  view on Meta::CPAN


#
# Author: Roland Mosler - Roland@Place.Ug
#
# Das ist eine uHTML-Bibliothek von Place.Ug
# Es ist erlaubt dieses Paket unter der GPLv3 zu nutzen
# Bei Weiterentwicklungen ist die Ursprungsbibliothek zu nennen
#
# Fehler und Verbesserungen bitte an uHTML@Place.Ug
#
# This is a uHTML library from Place.Ug
# It is allowed to use this library under the GPLv3
# The name of this library is to be named in all derivations
#
# Please report errors to uHTML@Place.Ug
#
# © Roland Mosler, Place.Ug
#


use strict ;

package uHTML::request ;

use version ; our $VERSION = "1.83" ;

require uHTML ;
use LWP::MediaTypes ;
use URI::Escape ;
use IO::Handle ;
use Time::Local( 'timegm','timelocal_nocheck' ) ;
use POSIX qw( strftime setlocale LC_TIME ) ;

my( @initRequest, @finishRequest ) ;

my @Empty = () ;

sub new
{
  my $class   = shift ;
  my $env     = shift ;
  my $req ;

  unless( ref $env eq 'HASH' )
  {
    my %E = %ENV ;
    $env = \%E ;
  }

  $env->{'PATH_INFO'}     =~ s%/*$%% ;
  $req->{'ENV'}           = $env ;
  $req->{'charset'}       = 'utf-8' ;
  $req->{'home'}          = $env->{'DATA_ROOT'} ? $env->{'DATA_ROOT'} : $env->{'SCRIPT_ROOT'} ;
  $req->{'Root'}          = $env->{'DOCUMENT_ROOT'} ;
  $req->{'Root'}         .= $env->{'REDIRECT_ROOT'} if $env->{'REDIRECT_ROOT'}  ;

  my $ru                  = $env->{'REQUEST_URI'} =~ s/\?.*//r ;
  $req->{'Request'}       = [ split m%/+%,$ru,-1 ] ;
  $req->{'Path'}          = [ split m%/+%,$env->{'PATH_INFO'},-1 ] ;
  $req->{'file'}          = $req->{'Root'} . $env->{'PATH_INFO'} ;

  if( -d $req->{'file'} )
  {
    $req->{'file'}       .= '/index.uhtml' ;
    $req->{'File'}        = 'index.uhtml' ;
    $req->{'RequestFile'} = 'index.uhtml';
  }
  else
  {
    $req->{'File'}        = pop @{$req->{'Path'}} ;
    $req->{'RequestFile'} = pop @{$req->{'Request'}} ;
  }

  $req->{'BaseName'}      = $req->{'File'} =~ s/\.[^\.]*$//ir ;
  $req->{'RequestName'}   = $req->{'RequestFile'} =~ s/\.[^\.]*$//ir ;
  $req->{'path'}          = join '/',@{$req->{'Path'}} ;
  $req->{'Path'}->[0]     = $env->{'HOST_NAME'} ? $env->{'HOST_NAME'} : $env->{'SERVER_NAME'} ;
  $req->{'request'}       = join '/'.@{$req->{'Request'}} ;
  $req->{'Request'}->[0]  = $env->{'HTTP_HOST'} ;

  return( $env->{'uRequest'} = bless( $req,$class ) ) ;
}

sub Init
{
  my $self = shift ;

  if( @_ )
  {
    my $func ;

    foreach $func( @_ )
    {
      next if ref $func ne 'CODE' ;
      next if grep $func == $_,@initRequest ;
      push @initRequest,$func ;
    }
  }
  elsif( ref $self eq 'uHTML::request' and not $self->{'InitRequest'} )
  {
    uHTML::loadModules( $self->{'ENV'} ) ;
    my @icopy = @initRequest ;  # side effect protection
    $_->($self) foreach @icopy ;
    $self->{'InitRequest'} = 1 ;
  }
  return $self ;
}

sub Finish
{
  my $self = shift ;

  if( @_ )
  {
    my $func ;

    foreach $func( @_ )
    {
      next if ref $func ne 'CODE' ;

uHTML/request.pm  view on Meta::CPAN

  uHTML::fileEnd() ;
}

sub HTML
{
  my $self   = shift ;
  my $string = shift ;

  $self->codeFile() unless $self->{'length'} ;        # process uHTML to HTML
  return( $string ? join( '',@{$self->{'HTML'}} ) : $self->{'HTML'} ) ;
}

sub putFile
{
  my $self = shift ;

  $self->FileData() unless $self->{'FileData'} ;
  $self->codeFile() unless $self->{'length'} ;        # process uHTML to HTML
  print foreach $self->{'HTML'} ? @{$self->{'HTML'}} : $self->{'FileData'} ;
}

sub process
{
  my $self = shift ;
  my $env  = shift ;

  $self = uHTML::request->new( $env ) unless ref $self eq 'uHTML::request'; # get a new uHTML::request if needed
#   $self->Init() ; # Initialise the request and call all init functions
#   $self->codeFile() ; # process uHTML to HTML
#   $self->Finish() ; #Close the request call all closing functions
  $self->putHeader() ; # Send out headers
  $self->putFile() ;   # Send out HTML
}

sub home
{
  my $self = shift ;

  return $self->{'home'} ;
}


sub file
{
  my $self = shift ;

  return $self->{'file'} ;
}

sub File
{
  my $self  = shift ;
  my $fname = shift ;

  if( $fname )
  {
    $fname = "/${\($self->Path())}/$fname" unless $fname =~ m%^/% ;
    if( -f "${\($self->Root())}$fname" )
    {
      my $p0               = $self->{'Path'}->[0] ;
      $self->{'Path'}      = [ split m%/+%,$fname,-1 ] ;
      $self->{'File'}      = pop @{$self->{'Path'}} ;
      $self->{'BaseName'}  = $self->{'File'} =~ s/\.[^\.]*$//ir ;
      $self->{'path'}      = join '/',@{$self->{'Path'}} ;
      $self->{'file'}      = "${\($self->Root())}$self->{'path'}/$self->{'File'}" ;
      $self->{'Path'}->[0] = $p0 ;
    }
  }

  return $self->{'File'} ;
}

sub BaseName
{
  my $self = shift ;
  return $self->{'BaseName'} ;
}

sub RequestName
{
  my $self = shift ;
  return $self->{'RequestName'} ;
}

sub Path
{
  my $self = shift ;
  my $idx  = shift ;

  return $self->{'Path'}->[$idx] if $idx =~ m/^\d+$/ ;
  return (wantarray ? @{$self->{'Path'}}[$1 .. $2] : join '/',@{$self->{'Path'}}[$1 .. $2]) if $idx =~ m/^(\d+)(?:-|\.\.)(\d+)$/ ;
  return (wantarray ? @{$self->{'Path'}} : $self->{'path'}) ;
}

sub RequestPath
{
  my $self = shift ;
  my $idx  = shift ;

  return $self->{'Request'}->[$idx] if $idx =~ m/^\d+$/ ;
  return (wantarray ? @{$self->{'Request'}}[$1 .. $2] : join '/',@{$self->{'Request'}}[$1 .. $2]) if $idx =~ m/^(\d+)(?:-|\.\.)(\d+)$/ ;
  return (wantarray ? @{$self->{'Request'}} : $self->{'request'}) ;
}

sub Root
{
  my $self = shift ;

  $self->{'Root'} = shift if @_ ;
  return $self->{'Root'} ;
}

sub ServerPath
{
  my $self = shift ;
  my $Path = shift ;

  return $self->Root() unless $Path ne '' ;
  return( $Path=~s/^#// ? ($self->{'home'} && $Path !~ m%^/% ? "$self->{'home'}/$Path" : $Path) :
                          ($self->{'Root'}.(  $Path !~ m%^/% ? "$self->{'path'}/$Path" : $Path)) ) ;
}



( run in 0.536 second using v1.01-cache-2.11-cpan-5511b514fd6 )