<?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 $name => $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>