<?php
class
Pluf_HTTP_Response_ServerError
extends
Pluf_HTTP_Response
{
function
__construct(
$exception
,
$mimetype
=null)
{
$content
=
''
;
$admins
= Pluf::f(
'admins'
,
array
());
if
(
count
(
$admins
) > 0) {
$stack
= Pluf_HTTP_Response_ServerError_Pretty(
$exception
);
$subject
=
$exception
->getMessage();
$subject
=
substr
(
strip_tags
(
nl2br
(
$subject
)), 0, 50).
'...'
;
foreach
(
$admins
as
$admin
) {
$email
=
new
Pluf_Mail(
$admin
[1],
$admin
[1],
$subject
);
$email
->addTextMessage(
$stack
);
$email
->sendMail();
}
}
try
{
$context
=
new
Pluf_Template_Context(
array
(
'message'
=>
$exception
->getMessage()));
$tmpl
=
new
Pluf_Template(
'500.html'
);
$content
=
$tmpl
->render(
$context
);
$mimetype
= null;
}
catch
(Exception
$e
) {
$mimetype
=
'text/plain'
;
$content
=
'The server encountered an unexpected condition which prevented it from fulfilling your request.'
.
"\n\n"
.
'An email has been sent to the administrators, we will correct this error as soon as possible. Thank you for your comprehension.'
.
"\n\n"
.
'500 - Internal Server Error'
;
}
parent::__construct(
$content
,
$mimetype
);
$this
->status_code = 500;
}
}
function
Pluf_HTTP_Response_ServerError_Pretty(
$e
)
{
$sub
= create_function(
'$f'
,'
$loc
=
""
;
if
(isset(
$f
[
"class"
])){
$loc
.=
$f
[
"class"
].
$f
[
"type"
];}
if
(isset(
$f
[
"function"
])){
$loc
.=
$f
[
"function"
];}
return
$loc
;');
$parms
= create_function(
'$f'
,'
$params
=
array
();
if
(isset(
$f
[
"function"
])){
try
{
if
(isset(
$f
[
"class"
])){
$r
=
new
ReflectionMethod(
$f
[
"class"
].
"::"
.
$f
[
"function"
]);}
else
{
$r
=
new
ReflectionFunction(
$f
[
"function"
]);}
return
$r
->getParameters();}
catch
(Exception
$e
){}}
return
$params
;');
$src2lines
= create_function(
'$file'
,'
$src
=
nl2br
(highlight_file(
$file
,TRUE));
return
explode
(
"<br />"
,
$src
);');
$clean
= create_function(
'$line'
,
'return html_entity_decode(str_replace(" ", " ", $line));'
);
$desc
= get_class(
$e
).
" making "
.
$_SERVER
[
'REQUEST_METHOD'
].
" request to "
.
$_SERVER
[
'REQUEST_URI'
];
$out
=
$desc
.
"\n"
;
if
(
$e
->getCode()) {
$out
.=
$e
->getCode().
' : '
;
}
$out
.=
$e
->getMessage().
"\n\n"
;
$out
.=
'PHP: '
.
$e
->getFile().
', line '
.
$e
->getLine().
"\n"
;
$out
.=
'URI: '
.
$_SERVER
[
'REQUEST_METHOD'
].
' '
.
$_SERVER
[
'REQUEST_URI'
].
"\n\n"
;
$out
.=
'** Stacktrace **'
.
"\n\n"
;
$frames
=
$e
->getTrace();
foreach
(
$frames
as
$frame_id
=>
$frame
) {
if
(!isset(
$frame
[
'file'
])) {
$frame
[
'file'
] =
'No File'
;
$frame
[
'line'
] =
'0'
;
}
$out
.=
'* '
.
$sub
(
$frame
).'
[
'.$frame['
file
'].'
, line
'.$frame['
line
'].'
] *'.
"\n"
;
if
(
is_readable
(
$frame
[
'file'
]) ) {
$out
.=
'* Src *'
.
"\n"
;
$lines
=
$src2lines
(
$frame
[
'file'
]);
$start
=
$frame
[
'line'
] < 5 ?
0 :
$frame
[
'line'
] -5;
$end
=
$start
+ 10;
$out2
=
''
;
$i
= 0;
foreach
(
$lines
as
$k
=>
$line
) {
if
(
$k
>
$end
) {
break
; }
$line
= trim(
strip_tags
(
$line
));
if
(
$k
<
$start
&& isset(
$frames
[
$frame_id
+1][
"function"
])
&& preg_match(
'/function( )*'
.preg_quote(
$frames
[
$frame_id
+1][
"function"
]).
'/'
,
$line
) ) {
$start
=
$k
;
}
if
(
$k
>=
$start
) {
if
(
$k
!=
$frame
[
'line'
] ) {
$out2
.= (
$start
+
$i
).
': '
.
$clean
(
$line
).
"\n"
;
}
else
{
$out2
.=
'>> '
.(
$start
+
$i
).
': '
.
$clean
(
$line
).
"\n"
;
}
$i
++;
}
}
$out
.=
$out2
;
}
else
{
$out
.=
'No src available.'
;
}
$out
.=
"\n"
;
}
$out
.=
"\n\n\n\n"
;
$out
.=
'** Request **'
.
"\n\n"
;
if
( function_exists(
'apache_request_headers'
) ) {
$out
.=
'* Request (raw) *'
.
"\n\n"
;
$req_headers
= apache_request_headers();
$out
.=
'HEADERS'
.
"\n"
;
if
(
count
(
$req_headers
) > 0 ) {
foreach
(
$req_headers
as
$req_h_name
=>
$req_h_val
) {
$out
.=
$req_h_name
.
': '
.
$req_h_val
.
"\n"
;
}
$out
.=
"\n"
;
}
else
{
$out
.=
'No headers.'
.
"\n"
;
}
if
(
strlen
(
$req_body
) > 0 ) {
$out
.=
'Body'
.
"\n"
;
$out
.=
$req_body
.
"\n"
;
}
}
$out
.=
"\n"
.
'* Request (parsed) *'
.
"\n\n"
;
$superglobals
=
array
(
'$_GET'
,
'$_POST'
,
'$_COOKIE'
,
'$_SERVER'
,
'$_ENV'
);
foreach
(
$superglobals
as
$sglobal
) {
$sfn
= create_function(
''
,
'return '
.
$sglobal
.
';'
);
$out
.=
$sglobal
.
"\n"
;
if
(
count
(
$sfn
()) > 0 ) {
foreach
(
$sfn
()
as
$k
=>
$v
) {
$out
.=
'Variable: '
.
$k
.
"\n"
;
$out
.=
'Value: '
.print_r(
$v
,TRUE).
"\n"
;
}
$out
.=
"\n"
;
}
else
{
$out
.=
'No data'
.
"\n\n"
;
}
}
if
( function_exists(
'headers_list'
) ) {
$out
.=
"\n\n\n\n"
;
$out
.=
'** Response **'
.
"\n\n"
;
$out
.=
'* Headers *'
.
"\n\n"
;
$resp_headers
= headers_list();
if
(
count
(
$resp_headers
) > 0) {
foreach
(
$resp_headers
as
$resp_h
) {
$out
.=
$resp_h
.
"\n"
;
}
$out
.=
"\n"
;
}
else
{
$out
.=
'No headers.'
.
"\n"
;
}
}
return
$out
;
}