mirror of
https://code.castopod.org/adaures/castopod.git
synced 2024-09-04 18:07:18 +02:00
- add .editorconfig file - format all files to comply with castopod's coding style - switch parsedown dependency with commonmark library to better follow commonmark spec for markdown - add prettier command to format all project files at once closes #16
535 lines
22 KiB
PHP
535 lines
22 KiB
PHP
<?php $error_id = uniqid('error', true); ?>
|
|
<!doctype html>
|
|
<html>
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="robots" content="noindex">
|
|
|
|
<title><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?></title>
|
|
<style type="text/css">
|
|
<?= preg_replace(
|
|
'#[\r\n\t ]+#',
|
|
' ',
|
|
file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
|
|
) ?>
|
|
</style>
|
|
|
|
<script type="text/javascript">
|
|
<?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
|
|
</script>
|
|
</head>
|
|
|
|
<body onload="init()">
|
|
|
|
<!-- Header -->
|
|
<div class="header">
|
|
<div class="container">
|
|
<h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'),
|
|
$exception->getCode()
|
|
? ' #' . $exception->getCode()
|
|
: '' ?></h1>
|
|
<p>
|
|
<?= $exception->getMessage() ?>
|
|
<a href="https://www.google.com/search?q=<?= urlencode(
|
|
$title .
|
|
' ' .
|
|
preg_replace(
|
|
'#\'.*\'|".*"#Us',
|
|
'',
|
|
$exception->getMessage()
|
|
)
|
|
) ?>" rel="noreferrer" target="_blank">search →</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Source -->
|
|
<div class="container">
|
|
<p><b><?= static::cleanPath(
|
|
$file,
|
|
$line
|
|
) ?></b> at line <b><?= $line ?></b></p>
|
|
|
|
<?php if (is_file($file)): ?>
|
|
<div class="source">
|
|
<?= static::highlightFile($file, $line, 15) ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="container">
|
|
|
|
<ul class="tabs" id="tabs">
|
|
<li><a href="#backtrace">Backtrace</a></li>
|
|
<li><a href="#server">Server</a></li>
|
|
<li><a href="#request">Request</a></li>
|
|
<li><a href="#response">Response</a></li>
|
|
<li><a href="#files">Files</a></li>
|
|
<li><a href="#memory">Memory</a></li>
|
|
</li>
|
|
</ul>
|
|
|
|
<div class="tab-content">
|
|
|
|
<!-- Backtrace -->
|
|
<div class="content" id="backtrace">
|
|
|
|
<ol class="trace">
|
|
<?php foreach ($trace as $index => $row): ?>
|
|
<li>
|
|
<p>
|
|
<!-- Trace info -->
|
|
<?php if (
|
|
isset($row['file']) &&
|
|
is_file($row['file'])
|
|
): ?>
|
|
<?php if (
|
|
isset($row['function']) &&
|
|
in_array($row['function'], [
|
|
'include',
|
|
'include_once',
|
|
'require',
|
|
'require_once',
|
|
])
|
|
) {
|
|
echo $row['function'] .
|
|
' ' .
|
|
static::cleanPath($row['file']);
|
|
} else {
|
|
echo static::cleanPath($row['file']) .
|
|
' : ' .
|
|
$row['line'];
|
|
} ?>
|
|
<?php else: ?>
|
|
{PHP internal code}
|
|
<?php endif; ?>
|
|
|
|
<!-- Class/Method -->
|
|
<?php if (isset($row['class'])): ?>
|
|
— <?= $row[
|
|
'class'
|
|
] .
|
|
$row['type'] .
|
|
$row['function'] ?>
|
|
<?php if (!empty($row['args'])): ?>
|
|
<?php $args_id =
|
|
$error_id . 'args' . $index; ?>
|
|
( <a href="#" onclick="return toggle('<?= $args_id ?>');">arguments</a> )
|
|
<div class="args" id="<?= $args_id ?>">
|
|
<table cellspacing="0">
|
|
|
|
<?php
|
|
$params = null;
|
|
// Reflection by name is not available for closure function
|
|
if (
|
|
substr(
|
|
$row['function'],
|
|
-1
|
|
) !== '}'
|
|
) {
|
|
$mirror = isset(
|
|
$row['class']
|
|
)
|
|
? new \ReflectionMethod(
|
|
$row['class'],
|
|
$row['function']
|
|
)
|
|
: new \ReflectionFunction(
|
|
$row['function']
|
|
);
|
|
$params = $mirror->getParameters();
|
|
}
|
|
foreach (
|
|
$row['args']
|
|
as $key => $value
|
|
): ?>
|
|
<tr>
|
|
<td><code><?= htmlspecialchars(
|
|
isset($params[$key])
|
|
? '$' .
|
|
$params[
|
|
$key
|
|
]->name
|
|
: "#$key",
|
|
ENT_SUBSTITUTE,
|
|
'UTF-8'
|
|
) ?></code></td>
|
|
<td>
|
|
<pre><?= print_r(
|
|
$value,
|
|
true
|
|
) ?></pre>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach;
|
|
?>
|
|
|
|
</table>
|
|
</div>
|
|
<?php else: ?>
|
|
()
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
|
|
<?php if (
|
|
!isset($row['class']) &&
|
|
isset($row['function'])
|
|
): ?>
|
|
— <?= $row[
|
|
'function'
|
|
] ?>()
|
|
<?php endif; ?>
|
|
</p>
|
|
|
|
<!-- Source? -->
|
|
<?php if (
|
|
isset($row['file']) &&
|
|
is_file($row['file']) &&
|
|
isset($row['class'])
|
|
): ?>
|
|
<div class="source">
|
|
<?= static::highlightFile(
|
|
$row['file'],
|
|
$row['line']
|
|
) ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</li>
|
|
|
|
<?php endforeach; ?>
|
|
</ol>
|
|
|
|
</div>
|
|
|
|
<!-- Server -->
|
|
<div class="content" id="server">
|
|
<?php foreach (['_SERVER', '_SESSION'] as $var): ?>
|
|
<?php if (
|
|
empty($GLOBALS[$var]) ||
|
|
!is_array($GLOBALS[$var])
|
|
) {
|
|
continue;
|
|
} ?>
|
|
|
|
<h3>$<?= $var ?></h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($GLOBALS[$var] as $key => $value): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars(
|
|
$key,
|
|
ENT_IGNORE,
|
|
'UTF-8'
|
|
) ?></td>
|
|
<td>
|
|
<?php if (is_string($value)): ?>
|
|
<?= htmlspecialchars(
|
|
$value,
|
|
ENT_SUBSTITUTE,
|
|
'UTF-8'
|
|
) ?>
|
|
<?php else: ?>
|
|
<?= '<pre>' .
|
|
print_r($value, true) ?>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endforeach; ?>
|
|
|
|
<!-- Constants -->
|
|
<?php $constants = get_defined_constants(true); ?>
|
|
<?php if (!empty($constants['user'])): ?>
|
|
<h3>Constants</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach (
|
|
$constants['user']
|
|
as $key => $value
|
|
): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars(
|
|
$key,
|
|
ENT_IGNORE,
|
|
'UTF-8'
|
|
) ?></td>
|
|
<td>
|
|
<?php if (
|
|
!is_array($value) &&
|
|
!is_object($value)
|
|
): ?>
|
|
<?= htmlspecialchars(
|
|
$value,
|
|
ENT_SUBSTITUTE,
|
|
'UTF-8'
|
|
) ?>
|
|
<?php else: ?>
|
|
<?= '<pre>' .
|
|
print_r($value, true) ?>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Request -->
|
|
<div class="content" id="request">
|
|
<?php $request = \Config\Services::request(); ?>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td style="width: 10em">Path</td>
|
|
<td><?= $request->uri ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>HTTP Method</td>
|
|
<td><?= $request->getMethod(true) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>IP Address</td>
|
|
<td><?= $request->getIPAddress() ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="width: 10em">Is AJAX Request?</td>
|
|
<td><?= $request->isAJAX() ? 'yes' : 'no' ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Is CLI Request?</td>
|
|
<td><?= $request->isCLI() ? 'yes' : 'no' ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Is Secure Request?</td>
|
|
<td><?= $request->isSecure() ? 'yes' : 'no' ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>User Agent</td>
|
|
<td><?= $request
|
|
->getUserAgent()
|
|
->getAgentString() ?></td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<?php $empty = true; ?>
|
|
<?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
|
|
<?php if (
|
|
empty($GLOBALS[$var]) ||
|
|
!is_array($GLOBALS[$var])
|
|
) {
|
|
continue;
|
|
} ?>
|
|
|
|
<?php $empty = false; ?>
|
|
|
|
<h3>$<?= $var ?></h3>
|
|
|
|
<table style="width: 100%">
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($GLOBALS[$var] as $key => $value): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars(
|
|
$key,
|
|
ENT_IGNORE,
|
|
'UTF-8'
|
|
) ?></td>
|
|
<td>
|
|
<?php if (
|
|
!is_array($value) &&
|
|
!is_object($value)
|
|
): ?>
|
|
<?= htmlspecialchars(
|
|
$value,
|
|
ENT_SUBSTITUTE,
|
|
'UTF-8'
|
|
) ?>
|
|
<?php else: ?>
|
|
<?= '<pre>' .
|
|
print_r($value, true) ?>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endforeach; ?>
|
|
|
|
<?php if ($empty): ?>
|
|
<div class="alert">
|
|
No $_GET, $_POST, or $_COOKIE Information to show.
|
|
</div>
|
|
|
|
<?php endif; ?>
|
|
|
|
<?php $headers = $request->getHeaders(); ?>
|
|
<?php if (!empty($headers)): ?>
|
|
<h3>Headers</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Header</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($headers as $value): ?>
|
|
<?php if (empty($value)) {
|
|
continue;
|
|
} ?>
|
|
<?php if (!is_array($value)) {
|
|
$value = [$value];
|
|
} ?>
|
|
<?php foreach ($value as $h): ?>
|
|
<tr>
|
|
<td><?= esc(
|
|
$h->getName(),
|
|
'html'
|
|
) ?></td>
|
|
<td><?= esc(
|
|
$h->getValueLine(),
|
|
'html'
|
|
) ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Response -->
|
|
<?php
|
|
$response = \Config\Services::response();
|
|
$response->setStatusCode(http_response_code());
|
|
?>
|
|
<div class="content" id="response">
|
|
<table>
|
|
<tr>
|
|
<td style="width: 15em">Response Status</td>
|
|
<td><?= $response->getStatusCode() .
|
|
' - ' .
|
|
$response->getReason() ?></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<?php $headers = $response->getHeaders(); ?>
|
|
<?php if (!empty($headers)): ?>
|
|
<?php natsort($headers); ?>
|
|
|
|
<h3>Headers</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Header</th>
|
|
<th>Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($headers as $name => $value): ?>
|
|
<tr>
|
|
<td><?= esc($name, 'html') ?></td>
|
|
<td><?= esc(
|
|
$response->getHeaderLine($name),
|
|
'html'
|
|
) ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Files -->
|
|
<div class="content" id="files">
|
|
<?php $files = get_included_files(); ?>
|
|
|
|
<ol>
|
|
<?php foreach ($files as $file): ?>
|
|
<li><?= htmlspecialchars(
|
|
static::cleanPath($file),
|
|
ENT_SUBSTITUTE,
|
|
'UTF-8'
|
|
) ?></li>
|
|
<?php endforeach; ?>
|
|
</ol>
|
|
</div>
|
|
|
|
<!-- Memory -->
|
|
<div class="content" id="memory">
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td>Memory Usage</td>
|
|
<td><?= static::describeMemory(
|
|
memory_get_usage(true)
|
|
) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="width: 12em">Peak Memory Usage:</td>
|
|
<td><?= static::describeMemory(
|
|
memory_get_peak_usage(true)
|
|
) ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Memory Limit:</td>
|
|
<td><?= ini_get('memory_limit') ?></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
</div>
|
|
|
|
</div> <!-- /tab-content -->
|
|
|
|
</div> <!-- /container -->
|
|
|
|
<div class="footer">
|
|
<div class="container">
|
|
|
|
<p>
|
|
Displayed at <?= date('H:i:sa') ?> —
|
|
PHP: <?= phpversion() ?> —
|
|
CodeIgniter: <?= \CodeIgniter\CodeIgniter::CI_VERSION ?>
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|