Skip to content
Snippets Groups Projects
error_exception.php 10.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?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'];
    									}
    									?>
    
    								<!-- 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> <!-- /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>