2024-09-06 20:28:06 +08:00

169 lines
4.9 KiB
PHP

<?php
use Luracast\Restler\Restler;
use Luracast\Restler\Util;
$template_vars = $data;//get_defined_vars();
unset($template_vars['response']);
unset($template_vars['api']);
unset($template_vars['request']);
unset($template_vars['stages']);
$template_vars['request'] = $data['request'];
$template_vars['stages'] = $data['stages'];
$call_trace = '';
function exceptions()
{
global $call_trace;
$r = Util::$restler;
$source = $r->_exceptions;
if (count($source)) {
$source = end($source);
$traces = array();
do {
$traces += $source->getTrace();
} while ($source = $source->getPrevious());
$traces += debug_backtrace();
$call_trace
= parse_backtrace($traces, 0);
} else {
$call_trace
= parse_backtrace(debug_backtrace());
}
}
exceptions();
function parse_backtrace($raw, $skip = 1)
{
$output = "";
foreach ($raw as $entry) {
if ($skip-- > 0) {
continue;
}
//$output .= print_r($entry, true) . "\n";
$output .= "\nFile: " . $entry['file'] . " (Line: " . $entry['line'] . ")\n";
if (isset($entry['class']))
$output .= $entry['class'] . "::";
$output .= $entry['function']
. "( " . json_encode($entry['args']) . " )\n";
}
return $output;
}
//print_r(get_defined_vars());
//print_r($response);
$icon;
if ($success && isset($api)) {
$arguments = implode(', ', $api->parameters);
$icon = "<icon class=\"success\"></icon>";
$title = "{$api->className}::"
. "{$api->methodName}({$arguments})";
} else {
if (isset($response['error']['message'])) {
$icon = '<icon class="denied"></icon>';
$title = end(explode(':',$response['error']['message'],2));
} else {
$icon = '<icon class="warning"></icon>';
$title = 'No Matching Resource';
}
}
function render($data, $shadow=true)
{
$r = '';
if (empty($data))
return $r;
$r .= $shadow ? "<ul class=\"shadow\">\n": "<ul>\n";
if (is_array($data)) {
// field name
foreach ($data as $key => $value) {
$r .= '<li>';
$r .= is_numeric($key)
? "<strong>[$key]</strong> "
: "<strong>$key: </strong>";
$r .= '<span>';
if (is_array($value)) {
// recursive
$r .= render($value,false);
} else {
// value, with hyperlinked hyperlinks
if (is_bool($value)) {
$value = $value ? 'true' : 'false';
}
$value = htmlentities($value, ENT_COMPAT, 'UTF-8');
if (strpos($value, 'http://') === 0) {
$r .= '<a href="' . $value . '">' . $value . '</a>';
} else {
$r .= $value;
}
}
$r .= "</span></li>\n";
}
} elseif (is_bool($data)) {
$r .= '<li>' . ($data ? 'true' : 'false') . '</li>';
} else {
$r .= "<li><strong>$data</strong></li>";
}
$r .= "</ul>\n";
return $r;
}
$reqHeadersArr = array();
$requestHeaders = $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . PHP_EOL;
foreach ($reqHeadersArr as $key => $value) {
if ($key == 'Host')
continue;
$requestHeaders .= "$key: $value" . PHP_EOL;
}
// $requestHeaders = $this->encode(apache_request_headers(), FALSE,
// FALSE);
$responseHeaders = implode(PHP_EOL, headers_list()).PHP_EOL.'Status: HTTP/1.1 ';
$responseHeaders .= Util::$restler->responseCode.' '.\Luracast\Restler\RestException::$codes[Util::$restler->responseCode];
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title?></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style>
<?php include __DIR__.'/debug.css'; ?>
</style>
</head>
<body>
<div id="breadcrumbs-one">
<?php
if(Util::$restler->exception){
$stages = Util::$restler->exception->getStages();
$curStage = Util::$restler->exception->getStage();
foreach($stages['success'] as $stage){
echo "<a href=\"#\">$stage</a>";
}
foreach($stages['failure'] as $stage){
echo '<a href="#" class="failure">'
. $stage
. ($stage==$curStage ? ' <span class="state"/> ' : '')
. '</a>';
}
} else {
foreach(Util::$restler->_events as $stage){
echo "<a href=\"#\">$stage</a>";
}
}
?>
</div>
<header>
<h1><?php echo $title ?></h1>
</header>
<article>
<h2>Response:<right><?php echo $icon;?></right></h2>
<pre class="header"><?php echo $responseHeaders ?></pre>
<?php echo render($response); ?>
<h2>Additional Template Data:</h2>
<?php echo render($template_vars); ?>
<p>Restler v<?php echo Restler::VERSION?></p>
</article>
</body>
</html>