Mercurial > pub > Impl
comparison lib/IMPL/Web/Handler/ErrorHandler.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
| author | cin |
|---|---|
| date | Fri, 04 Sep 2015 19:40:23 +0300 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 406:f23fcb19d3c1 | 407:c6e90e02dd17 |
|---|---|
| 1 package IMPL::Web::Handler::ErrorHandler; | |
| 2 use strict; | |
| 3 | |
| 4 use IMPL::Const qw(:prop); | |
| 5 use IMPL::Exception(); | |
| 6 use IMPL::declare { | |
| 7 require => { | |
| 8 WebException => 'IMPL::Web::Exception', | |
| 9 ArgumentException => '-IMPL::InvalidArgumentException', | |
| 10 IOException => '-IMPL::IOException', | |
| 11 HttpResponse => 'IMPL::Web::HttpResponse', | |
| 12 Security => 'IMPL::Security' | |
| 13 }, | |
| 14 base => { | |
| 15 'IMPL::Object' => undef, | |
| 16 'IMPL::Object::Autofill' => '@_', | |
| 17 'IMPL::Object::Serializable' => undef | |
| 18 }, | |
| 19 props => [ | |
| 20 errors => PROP_RW, | |
| 21 view => PROP_RW, | |
| 22 fallback => PROP_RW, | |
| 23 contentType => PROP_RW | |
| 24 ] | |
| 25 }; | |
| 26 | |
| 27 sub CTOR { | |
| 28 my ($this) = @_; | |
| 29 | |
| 30 die ArgumentException->new("view") unless $this->view; | |
| 31 die ArgumentException->new("fallback") unless $this->fallback; | |
| 32 | |
| 33 $this->errors({}) unless $this->errors; | |
| 34 | |
| 35 } | |
| 36 | |
| 37 sub Invoke { | |
| 38 my ($this,$action,$next) = @_; | |
| 39 | |
| 40 undef $@; | |
| 41 my $result; | |
| 42 eval { | |
| 43 $result = $next ? $next->($action) : undef; | |
| 44 }; | |
| 45 | |
| 46 if (my $err = $@) { | |
| 47 | |
| 48 my $vars = { | |
| 49 error => $err, | |
| 50 result => $result, | |
| 51 request => sub { $action }, | |
| 52 app => $action->application, | |
| 53 location => $action->context->{resourceLocation}, | |
| 54 resource => $action->context->{resource}, | |
| 55 document => {}, | |
| 56 session => sub { Security->context }, | |
| 57 user => sub { Security->principal }, | |
| 58 security => sub { $action->security } | |
| 59 }; | |
| 60 | |
| 61 my $status = "500 Internal Server Error"; | |
| 62 | |
| 63 if (eval { $err->isa(WebException) }) { | |
| 64 $status = $err->status; | |
| 65 } | |
| 66 | |
| 67 my ($code) = ($status =~ m/^(\d+)/); | |
| 68 | |
| 69 my $text = $this->view->display( | |
| 70 $err, | |
| 71 $this->errors->{$code} || $this->fallback, | |
| 72 $vars | |
| 73 ); | |
| 74 | |
| 75 $result = HttpResponse->new( | |
| 76 status => $status, | |
| 77 type => $this->contentType, | |
| 78 charset => 'utf-8', | |
| 79 headers => eval{ $err->headers } || {}, | |
| 80 body => $text | |
| 81 ); | |
| 82 } | |
| 83 | |
| 84 return $result; | |
| 85 } | |
| 86 | |
| 87 1; | |
| 88 | |
| 89 __END__ | |
| 90 | |
| 91 =pod | |
| 92 | |
| 93 =head1 NAME | |
| 94 | |
| 95 C<IMPL::Web::Handler::ErrorHandler> - обертка для обработки исключений. | |
| 96 | |
| 97 =head1 SYNOPSIS | |
| 98 | |
| 99 Используется в цеопчке обработчиков приложения. | |
| 100 | |
| 101 =begin code xml | |
| 102 | |
| 103 <handlers type="ARRAY"> | |
| 104 <item type="IMPL::Web::Handler::ErrorHandler"> | |
| 105 <contentType>text/html</contentType> | |
| 106 <loader refid="tt-loader"/> | |
| 107 <errors type="HASH"> | |
| 108 <error extname="500">errors/500</error> | |
| 109 <error extname="404">errors/404</error> | |
| 110 <error extname="403">errors/403</error> | |
| 111 </errors> | |
| 112 <fallback>errors/500</fallback> | |
| 113 </item> | |
| 114 </handlers> | |
| 115 | |
| 116 =end code xml | |
| 117 | |
| 118 =head1 DESCRIPTION | |
| 119 | |
| 120 Позволяет создать представление для ресурса в случае ошибки, для этого | |
| 121 используется соответствие представлений и кодов ошибок. | |
| 122 | |
| 123 В результате обработчик либо прозрачно передает результат вышестоящего | |
| 124 обработчика нижестоящему, либо создает C<IMPL::Web::HttpResponse> с | |
| 125 соответствующим статусом и содержанием. | |
| 126 | |
| 127 =cut |
