package awe::View;
use strict;
use awe::Context;
use awe::Conf;
use awe::Log;
use Apache::Constants;
sub show {
my $template=shift;
# При неустановленном темплейте просто ненадо ничего показывать
# при условии конечно что результат не OK
unless ($template) {
fatal(18) if http_code()==OK;
return http_code();
}
my $method = "awe::View_$template->{type}"->can('show')
|| awe::Log::fatal(12,$template->{type});
return &$method(apr(),$template,@_);
}
sub getTemplateDir {
my $template=shift;
return $template->{dir}
|| conf("templateType.$template->{type}.dir")
|| conf('templateType.default.dir');
}
##########################################################
# Show templates methods
##########################################################
package awe::View_error;
use awe::Context;
use Apache::Constants qw(:common REDIRECT BAD_REQUEST OK);
## Внимание! Во время вызова этой процедуры все deinit-ено
sub getPage {
my $error=shift;
my $str="
Fatal Error
$error";
$str=~s/\n/
/g;
return $str;
}
sub show {
my ($r,$template,$error)=@_;
$r->content_type('text/html');
$r->send_http_header;
return 1 if
my $original_request = $r->prev;
return 1
if $r->header_only;
$r->print(getPage($error));
return SERVER_ERROR;
}
################################################################################
package awe::View_tt2;
use strict;
use Template;
use awe::Conf;
use awe::Log;
use awe::Context;
use awe::View;
use Apache::Constants qw(:common REDIRECT BAD_REQUEST OK);
sub show {
my ($r,$template,$result,$data)=@_;
$r->content_type('text/html');
$r->send_http_header;
unless ($r->prev || $r->header_only) {
my $dir = awe::View::getTemplateDir($template);
my $objectsDir = conf('templates.'.context('object').'.DIR');
if ($objectsDir) {
$objectsDir="$dir$objectsDir" if $objectsDir=~m!^[^/]!;
$template->{template}=$objectsDir.$template->{template};
$dir="$objectsDir:$dir";
}
my $tt = Template->
new({
OUTPUT => $r,
COMPILE_DIR => '/tmp/ttc',
COMPILE_EXT => '.ttc',
INTERPOLATE => 1, # Позволяет использовать $vasya вместо [% vasya %]
POST_CHOMP => 1,
PRE_CHOMP => 1,
INCLUDE_PATH=> $dir,
ABSOLUTE => 1,
TRIM => 1, # Удаляет CR/LF
# AUTO_RESET => 1, #?
}) || fatal(49,Template->error());
$tt->process($template->{template},
{context => context(),
result => $result,
data => $data})
|| fatal(49,$tt->error());
}
return http_code();
}
################################################################################
package awe::View_fd;
use strict;
sub show {
my ($r,$template,$data)=@_;
# $r->content_type($stylesheet->media_type());
$r->send_http_header;
$r->send_fd($data)
unless $r->prev || $r->header_only;
return http_code();
}
################################################################################
package awe::View_file;
use strict;
use awe::Context;
use Apache::Constants;
use Apache::Constants qw(:response :methods :http);
use Apache::File ();
use Apache::Log ();
sub show {
my ($r,$template,$result,$data)=@_;
$result={file=>$result} unless ref($result);
# my $ct=$result->{ct} || 'application/octet-stream';
# if ($r->prev || $r->header_only) {
# $r->content_type($ct);
# $r->send_http_header;
# return;
# }
# my $fh = Apache::gensym();
# open($fh, $result->{file} || $r->filename()) || return http_code(NOT_FOUND);
# $r->content_type($ct);
# $r->send_http_header;
# $r->send_fd($fh);
# close($fh);
if ((my $rc=$r->discard_request_body)!=OK) {
return http_code($rc);
}
if ($r->method_number==M_INVALID) {
$r->log->error("Invalid method in request",$r->the_request);
return http_code(NOT_IMPLEMENTED);
}
if ($r->method_number==M_OPTIONS) {
return http_code(DECLINED); #http_core.c:default_handler()willpickthisup
}
if ($r->method_number==M_PUT) {
return http_code(HTTP_METHOD_NOT_ALLOWED);
}
$r->filename($result->{file}) if $result->{file};
unless(-e $r->finfo){
$r->log->error("File does not exist:",$r->filename);
return http_code(NOT_FOUND);
}
$r->content_type($r->lookup_file($r->filename)->content_type);
if ($r->method_number!=M_GET) {
return http_code(HTTP_METHOD_NOT_ALLOWED);
}
my $fh=Apache::File->new($r->filename);
unless($fh){
$r->log->error("file permissions deny server access:",
$r->filename);
return http_code(FORBIDDEN);
}
unless ($result->{nomtime}) {
$r->update_mtime(-s $r->finfo);
$r->set_last_modified;
$r->set_etag;
if ((my $rc = $r->meets_conditions )!=OK) {
return http_code($rc);
}
}
$r->set_content_length;
$r->send_http_header;
unless($r->header_only){
$r->send_fd($fh);
}
close $fh;
return http_code();
}
#####################################################################
package awe::View_redirect;
use strict;
use awe::Context;
use awe::Log;
use Apache::Constants qw(:common REDIRECT BAD_REQUEST OK);
sub show {
my($r,$template)=@_;
my $url=$template->{template}||fatal(24);
my $orig=$url;
foreach (split('\|',$url)) {
$_=uri()->home().$_
if /^\?/||/^[^\/:]+\//;
if ($_) {
s/\&/\?/
if !/\?/;
if (uri()->current() eq $_) {
warning(25);
$_=uri()->home();
}
$r->header_out(Location=>$url||fatal(24));
}
}
$url=~s/([=?]?)\$\{([a-zA-Z0-9_:]+)\}/_parseParam($1,$2)/ge;
fatal(24,$orig)
unless $url;
$r->header_out(Location=>$url);
return REDIRECT;
}
sub _parseParam {
my ($encode,$name)=@_;
my $value;
my $check_lp=0;
if ($name eq 'referer') {
$check_lp=1;
$value=uri()->referer();
} elsif ($name eq 'current') {
$check_lp=1;
$value=uri()->current();
} elsif ($name eq 'home') {
$value=uri()->home();
} elsif ($name eq 'base') {
$value=uri()->base();
} elsif ($name=~/^param:(.+)$/){
$value=param($1);
}
#URI::Escape::uri_escape-кодируетвсе
$value=encode_uri($value) #кодируетневсе,напримероставляет&,кажется
if $encode;
if ($check_lp) {
# die'checkloginandpasswordparameters';
# $value=~s/[\&|\?]login=([^&]*)//;
# $value=~s/[\&|\?]password=([^&]*)//;
}
return $value;
}
1;
#suburlenc
#{
#my$self=shift;
#my$s=shift;
#$s=~s/([^\a-zA-Z0-9\.\*_-])/sprintf"%%%02X",ord$1/eg;
#$s=~tr//+/;
#return$s;
#}