castopod/app/Views/errors/html/error_exception.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 &rarr;</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'])): ?>
&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= $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'])
): ?>
&nbsp;&nbsp;&mdash;&nbsp;&nbsp; <?= $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') ?> &mdash;
PHP: <?= phpversion() ?> &mdash;
CodeIgniter: <?= \CodeIgniter\CodeIgniter::CI_VERSION ?>
</p>
</div>
</div>
</body>
</html>