line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*- |
2
|
|
|
|
|
|
|
# vim:ts=8:sw=2:et:sta:sts=2 |
3
|
|
|
|
|
|
|
######### |
4
|
|
|
|
|
|
|
# Author: rmp |
5
|
|
|
|
|
|
|
# |
6
|
|
|
|
|
|
|
package ClearPress::view::error; |
7
|
4
|
|
|
4
|
|
895
|
use strict; |
|
4
|
|
|
|
|
8
|
|
|
4
|
|
|
|
|
114
|
|
8
|
4
|
|
|
4
|
|
23
|
use warnings; |
|
4
|
|
|
|
|
9
|
|
|
4
|
|
|
|
|
109
|
|
9
|
4
|
|
|
4
|
|
22
|
use base qw(ClearPress::view Class::Accessor); |
|
4
|
|
|
|
|
8
|
|
|
4
|
|
|
|
|
549
|
|
10
|
4
|
|
|
4
|
|
22
|
use English qw(-no_match_vars); |
|
4
|
|
|
|
|
9
|
|
|
4
|
|
|
|
|
26
|
|
11
|
4
|
|
|
4
|
|
1319
|
use Template; |
|
4
|
|
|
|
|
7
|
|
|
4
|
|
|
|
|
85
|
|
12
|
4
|
|
|
4
|
|
17
|
use Carp; |
|
4
|
|
|
|
|
8
|
|
|
4
|
|
|
|
|
165
|
|
13
|
4
|
|
|
4
|
|
20
|
use Readonly; |
|
4
|
|
|
|
|
19
|
|
|
4
|
|
|
|
|
2149
|
|
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
__PACKAGE__->mk_accessors(qw(errstr)); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
our $VERSION = q[476.4.2]; |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
Readonly::Scalar our $CODEMAP => { |
20
|
|
|
|
|
|
|
300 => q[Multiple Choices], |
21
|
|
|
|
|
|
|
301 => q[Moved Permanently], |
22
|
|
|
|
|
|
|
302 => q[Found], |
23
|
|
|
|
|
|
|
303 => q[See Other], |
24
|
|
|
|
|
|
|
304 => q[Not Modified], |
25
|
|
|
|
|
|
|
306 => q[Switch Proxy], |
26
|
|
|
|
|
|
|
307 => q[Temporary Redirect], |
27
|
|
|
|
|
|
|
308 => q[Resume Incomplete], |
28
|
|
|
|
|
|
|
400 => q[Bad Request], |
29
|
|
|
|
|
|
|
401 => q[Unauthorised], |
30
|
|
|
|
|
|
|
402 => q[Payment Required], |
31
|
|
|
|
|
|
|
403 => q[Forbidden], |
32
|
|
|
|
|
|
|
404 => q[Not Found], |
33
|
|
|
|
|
|
|
405 => q[Method Not Allowed], |
34
|
|
|
|
|
|
|
406 => q[Not Acceptable], |
35
|
|
|
|
|
|
|
407 => q[Proxy Authentication Required], |
36
|
|
|
|
|
|
|
408 => q[Request Timeout], |
37
|
|
|
|
|
|
|
409 => q[Conflict], |
38
|
|
|
|
|
|
|
410 => q[Gone], |
39
|
|
|
|
|
|
|
411 => q[Length Required], |
40
|
|
|
|
|
|
|
412 => q[Precondition Failed], |
41
|
|
|
|
|
|
|
413 => q[Request Entity Too Large], |
42
|
|
|
|
|
|
|
414 => q[Request-URI Too Long], |
43
|
|
|
|
|
|
|
415 => q[Unsupported Media Type], |
44
|
|
|
|
|
|
|
416 => q[Requested Range Not Satisfiable], |
45
|
|
|
|
|
|
|
417 => q[Expectation Failed], |
46
|
|
|
|
|
|
|
500 => q[Internal Server Error], |
47
|
|
|
|
|
|
|
501 => q[Not Implemented], |
48
|
|
|
|
|
|
|
502 => q[Bad Gateway], |
49
|
|
|
|
|
|
|
503 => q[Service Unavailable], |
50
|
|
|
|
|
|
|
504 => q[Gateway Timeout], |
51
|
|
|
|
|
|
|
505 => q[HTTP Version Not Supported], |
52
|
|
|
|
|
|
|
511 => q[Network Authentication Required], |
53
|
|
|
|
|
|
|
}; |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
sub safe_errors { |
56
|
1
|
|
|
1
|
1
|
4
|
return 1; |
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
sub init { |
60
|
1
|
|
|
1
|
1
|
3
|
my $self = shift; |
61
|
1
|
|
|
|
|
4
|
my $util = $self->util; |
62
|
1
|
|
|
|
|
11
|
my $cgi = $util->cgi; |
63
|
|
|
|
|
|
|
|
64
|
1
|
|
50
|
|
|
5
|
$self->{errstr} = $cgi->unescape($cgi->param('errstr') || q[]) || q[]; |
65
|
|
|
|
|
|
|
|
66
|
1
|
|
|
|
|
41
|
return $self->SUPER::init(); |
67
|
|
|
|
|
|
|
} |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
sub render { |
70
|
1
|
|
|
1
|
1
|
5
|
my $self = shift; |
71
|
1
|
|
|
|
|
4
|
my $util = $self->util; |
72
|
1
|
|
|
|
|
12
|
my $cgi = $util->cgi; |
73
|
1
|
|
50
|
|
|
4
|
my $aspect = $self->aspect() || q[]; |
74
|
1
|
|
|
|
|
14
|
my $errstr = $self->errstr; |
75
|
1
|
|
50
|
|
|
11
|
my $pi = $ENV{PATH_INFO} || q[]; |
76
|
1
|
|
|
|
|
9
|
my ($code) = $pi =~ m{(\d+)}smix; # Requires Apache ErrorDocument //. mod_perl can use $ENV{REDIRECT_STATUS} but doesn't work under cgi |
77
|
|
|
|
|
|
|
|
78
|
1
|
|
50
|
|
|
23
|
$errstr ||= $CODEMAP->{$code||q[]}; |
|
|
|
33
|
|
|
|
|
79
|
1
|
|
50
|
|
|
16
|
$errstr ||= q[]; |
80
|
|
|
|
|
|
|
|
81
|
1
|
50
|
|
|
|
13
|
if(Template->error()) { |
82
|
0
|
|
|
|
|
0
|
$errstr .= q(Template Error: ) . Template->error(); |
83
|
|
|
|
|
|
|
} |
84
|
|
|
|
|
|
|
|
85
|
1
|
50
|
|
|
|
21
|
if($self->safe_errors) { |
86
|
1
|
50
|
|
|
|
4
|
print {*STDERR} "Serving error: $errstr\n" or croak $ERRNO; |
|
1
|
|
|
|
|
31
|
|
87
|
1
|
|
|
|
|
6
|
$errstr =~ s/[ ]at[ ]\S+[ ]line[ ][[:digit:]]+//smxg; |
88
|
1
|
|
|
|
|
5
|
$errstr =~ s/\s+[.]?$//smx; |
89
|
|
|
|
|
|
|
} |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
######### |
92
|
|
|
|
|
|
|
# initialise tt_filters by resetting tt |
93
|
|
|
|
|
|
|
# |
94
|
1
|
|
|
|
|
23
|
delete $util->{tt}; |
95
|
1
|
|
|
|
|
87
|
my $tt = $self->tt; |
96
|
1
|
|
|
|
|
3
|
my $content = q[]; |
97
|
1
|
|
|
|
|
11
|
my $decor = $self->decorator; |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
# carp qq[$self view::error: handling error response]; |
100
|
1
|
50
|
|
|
|
21
|
if($aspect =~ /(?:ajax|xml|rss|atom)$/smx) { |
|
|
50
|
|
|
|
|
|
101
|
0
|
|
|
|
|
0
|
my $escaped = $self->tt_filters->{xml_entity}->($errstr); |
102
|
0
|
|
|
|
|
0
|
$content = qq[\nError: $escaped]; |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
} elsif($aspect =~ /json$/smx) { |
105
|
0
|
|
|
|
|
0
|
my $escaped = $self->tt_filters->{js_string}->($errstr); |
106
|
0
|
|
|
|
|
0
|
$content = qq[{"error":"Error: $escaped"}]; |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
} else { |
109
|
1
|
|
|
|
|
5
|
my $escaped = $self->tt_filters->{xml_entity}->($errstr); |
110
|
1
|
|
50
|
|
|
43
|
my $message = $CODEMAP->{$code||q[]} || q[An Error Occurred]; |
111
|
1
|
|
|
|
|
19
|
$content = sprintf <<'EOT', $message, $self->actions(), $escaped; |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
%s |
114
|
|
|
|
|
|
|
%s |
115
|
|
|
|
|
|
|
Error: %s |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
EOT |
118
|
|
|
|
|
|
|
} |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
######### |
121
|
|
|
|
|
|
|
# render should return content for non-streamed responses |
122
|
|
|
|
|
|
|
# |
123
|
1
|
|
|
|
|
4
|
return $content; |
124
|
|
|
|
|
|
|
} |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
1; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
__END__ |