Source for file bluescreen.phtml

Documentation is available at bluescreen.phtml

  1. 1: <?php
  2. 2:  
  3. 3: /**
  4. 4:  * Nette Framework - Debugger bluescreen template.
  5. 5:  *
  6. 6:  * Copyright (c) 2004, 2009 David Grudl (http://davidgrudl.com)
  7. 7:  *
  8. 8:  * This source file is subject to the "Nette license" that is bundled
  9. 9:  * with this package in the file license.txt.
  10. 10:  *
  11. 11:  * For more information please see http://nettephp.com
  12. 12:  *
  13. 13:  * @author     David Grudl
  14. 14:  * @copyright  Copyright (c) 2004, 2009 David Grudl
  15. 15:  * @license    http://nettephp.com/license  Nette license
  16. 16:  * @link       http://nettephp.com
  17. 17:  * @category   Nette
  18. 18:  * @package    Nette
  19. 19:  *
  20. 20:  * @param      array     $exception 
  21. 21:  * @param      array     $colophons 
  22. 22:  * @param      array     $internals 
  23. 23:  * @param      Application $application 
  24. 24:  * @return     void 
  25. 25:  */
  26. 26:  
  27. 27:  
  28. 28:  
  29. 29: if (!function_exists('_netteDebugPrintCode')) {
  30. 30:  
  31. 31: /**
  32. 32:  * Prints source code.
  33. 33:  * @param  string 
  34. 34:  * @param  int 
  35. 35:  * @param  int 
  36. 36:  * @return void 
  37. 37:  */
  38. 38: function _netteDebugPrintCode($file$line$count 15)
  39. 39: {
  40. 40:     if (function_exists('ini_set')) {
  41. 41:         ini_set('highlight.comment''#999; font-style: italic');
  42. 42:         ini_set('highlight.default''#000');
  43. 43:         ini_set('highlight.html''#06b');
  44. 44:         ini_set('highlight.keyword''#d24; font-weight: bold');
  45. 45:         ini_set('highlight.string''#080');
  46. 46:     }
  47. 47:  
  48. 48:     $start max(1$line floor($count 2));
  49. 49:  
  50. 50:     $source @file_get_contents($file);
  51. 51:     if (!$sourcereturn;
  52. 52:     $source explode("\n"highlight_string($sourceTRUE));
  53. 53:     $spans 1;
  54. 54:     echo $source[0]// <code><span color=highlight.html>
  55. 55:     $source explode('<br />'$source[1]);
  56. 56:     array_unshift($sourceNULL);
  57. 57:  
  58. 58:     $i $start// find last highlighted block
  59. 59:     while (--$i >= 1{
  60. 60:         if (preg_match('#.*(</?span[^>]*>)#'$source[$i]$m)) {
  61. 61:             if ($m[1!== '</span>'$spans++echo $m[1]}
  62. 62:             break;
  63. 63:         }
  64. 64:     }
  65. 65:  
  66. 66:     $source array_slice($source$start$countTRUE);
  67. 67:     end($source);
  68. 68:     $numWidth strlen((string) key($source));
  69. 69:  
  70. 70:     foreach ($source as $n => $s{
  71. 71:         $spans += substr_count($s'<span'substr_count($s'</span');
  72. 72:         $s str_replace(array("\r""\n")array('''')$s);
  73. 73:         if ($n === $line{
  74. 74:             printf(
  75. 75:                 "<span class='highlight'>Line %{$numWidth}s:    %s\n</span>%s",
  76. 76:                 $n,
  77. 77:                 strip_tags($s),
  78. 78:                 preg_replace('#[^>]*(<[^>]+>)[^<]*#''$1'$s)
  79. 79:             );
  80. 80:         else {
  81. 81:             printf("<span class='line'>Line %{$numWidth}s:</span>    %s\n"$n$s);
  82. 82:         }
  83. 83:     }
  84. 84:     echo str_repeat('</span>'$spans)'</code>';
  85. 85: }
  86. 86:  
  87. 87:  
  88. 88:  
  89. 89: /**
  90. 90:  * Dumps variable.
  91. 91:  * @param  mixed 
  92. 92:  * @return string 
  93. 93:  */
  94. 94: function _netteDump($var)
  95. 95: {
  96. 96:     return preg_replace_callback('#(<pre class="dump">|\s+)?(.*)\((\d+)\) <code>#''_netteDumpCb'Debug::dump($varTRUE));
  97. 97: }
  98. 98:  
  99. 99: function _netteDumpCb($m)
  100. 101:     return "$m[1]<a href='#' onclick='return !netteToggle(this)'>$m[2]($m[3](trim($m[1]|| $m[3'<abbr>&#x25bc;</abbr> </a><code>' '<abbr>&#x25ba;</abbr> </a><code class="collapsed">');
  101. 103:  
  102. 104:  
  103. 105:  
  104. 106: /**
  105. 107:  * Opens panel.
  106. 108:  * @param  string 
  107. 109:  * @param  bool 
  108. 110:  * @return void 
  109. 111:  */
  110. 112: function _netteOpenPanel($name$collapsed)
  111. 114:     static $id;
  112. 115:     $id++;
  113. 116:     ?>
  114. 117:     <div class="panel">
  115. 118:         <h2><a href="#" onclick="return !netteToggle(this, 'pnl<?php echo $id ?>')"><?php echo htmlSpecialChars($name?> <abbr><?php echo $collapsed '&#x25ba;' '&#x25bc;' ?></abbr></a></h2>
  116. 119:  
  117. 120:         <div id="pnl<?php echo $id ?>" class="<?php echo $collapsed 'collapsed ' '' ?>inner">
  118. 121:     <?php
  119. 123:  
  120. 124:  
  121. 125:  
  122. 126: /**
  123. 127:  * Closes panel.
  124. 128:  * @return void 
  125. 129:  */
  126. 130: function _netteClosePanel()
  127. 132:     ?>
  128. 133:         </div>
  129. 134:     </div>
  130. 135:     <?php
  131. 137:  
  132. 139:  
  133. 140:  
  134. 141: /**
  135. 142:  * Page title.
  136. 143:  */
  137. 144: static $errorTypes array(
  138. 145:     E_ERROR => 'Fatal Error',
  139. 146:     E_USER_ERROR => 'User Error',
  140. 147:     E_RECOVERABLE_ERROR => 'Recoverable Error',
  141. 148:     E_CORE_ERROR => 'Core Error',
  142. 149:     E_COMPILE_ERROR => 'Compile Error',
  143. 150:     E_PARSE => 'Parse Error',
  144. 151:     E_WARNING => 'Warning',
  145. 152:     E_CORE_WARNING => 'Core Warning',
  146. 153:     E_COMPILE_WARNING => 'Compile Warning',
  147. 154:     E_USER_WARNING => 'User Warning',
  148. 155:     E_NOTICE => 'Notice',
  149. 156:     E_USER_NOTICE => 'User Notice',
  150. 157:     E_STRICT => 'Strict',
  151. 158:     E_DEPRECATED => 'Deprecated',
  152. 159:     E_USER_DEPRECATED => 'User Deprecated',
  153. 160: );
  154. 161: $title ($exception instanceof FatalErrorException && isset($errorTypes[$exception->getSeverity()])) $errorTypes[$exception->getSeverity()get_class($exception);
  155. 162: $rn 0;
  156. 163:  
  157. 164: if (headers_sent()) {
  158. 165:     echo '</pre></xmp></table>';
  159. 167:  
  160. 168: ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  161. 169: <html lang="en">
  162. 170: <head>
  163. 171:     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  164. 172:     <meta name="robots" content="noindex,noarchive">
  165. 173:     <meta name="generator" content="Nette Framework">
  166. 174:  
  167. 175:     <title><?php echo htmlspecialchars($title?></title><!-- <?php echo $exception->getMessage()($exception->getCode(' #' $exception->getCode(''?> -->
  168. 176:  
  169. 177:     <style type="text/css">
  170. 178:     /* <![CDATA[ */
  171. 179:         body {
  172. 180:             margin: 0 0 2em;
  173. 181:             padding: 0;
  174. 182:         }
  175. 183:  
  176. 184:         #netteBluescreen {
  177. 185:             font: 9pt/1.5 Verdana, sans-serif;
  178. 186:             background: white;
  179. 187:             color: #333;
  180. 188:             position: absolute;
  181. 189:             left: 0;
  182. 190:             top: 0;
  183. 191:             width: 100%;
  184. 192:             z-index: 23178;
  185. 193:             text-align: left;
  186. 194:         }
  187. 195:  
  188. 196:         #netteBluescreen * {
  189. 197:             color: inherit;
  190. 198:             background: inherit;
  191. 199:             text-align: inherit;
  192. 200:         }
  193. 201:  
  194. 202:         #netteBluescreenIcon {
  195. 203:             position: absolute;
  196. 204:             right: .5em;
  197. 205:             top: .5em;
  198. 206:             z-index: 23179;
  199. 207:             text-decoration: none;
  200. 208:             background: red;
  201. 209:             padding: 3px;
  202. 210:         }
  203. 211:  
  204. 212:         #netteBluescreenIcon abbr {
  205. 213:             color: black !important;
  206. 214:         }
  207. 215:  
  208. 216:         #netteBluescreen h1 {
  209. 217:             font: 18pt/1.5 Verdana, sans-serif !important;
  210. 218:             margin: .6em 0;
  211. 219:         }
  212. 220:  
  213. 221:         #netteBluescreen h2 {
  214. 222:             font: 14pt/1.5 sans-serif !important;
  215. 223:             color: #888;
  216. 224:             margin: .6em 0;
  217. 225:         }
  218. 226:  
  219. 227:         #netteBluescreen a {
  220. 228:             text-decoration: none;
  221. 229:             color: #4197E3;
  222. 230:         }
  223. 231:  
  224. 232:         #netteBluescreen a abbr {
  225. 233:             font-family: sans-serif;
  226. 234:             color: #999;
  227. 235:         }
  228. 236:  
  229. 237:         #netteBluescreen h3 {
  230. 238:             font: bold 10pt/1.5 Verdana, sans-serif !important;
  231. 239:             margin: 1em 0;
  232. 240:             padding: 0;
  233. 241:         }
  234. 242:  
  235. 243:         #netteBluescreen p {
  236. 244:             margin: .8em 0
  237. 245:         }
  238. 246:  
  239. 247:         #netteBluescreen pre, #netteBluescreen code, #netteBluescreen table {
  240. 248:             font: 9pt/1.5 Consolas, monospace !important;
  241. 249:         }
  242. 250:  
  243. 251:         #netteBluescreen pre, #netteBluescreen table {
  244. 252:             background: #fffbcc;
  245. 253:             padding: .4em .7em;
  246. 254:             border: 1px dotted silver;
  247. 255:         }
  248. 256:  
  249. 257:         #netteBluescreen table pre {
  250. 258:             padding: 0;
  251. 259:             margin: 0;
  252. 260:             border: none;
  253. 261:         }
  254. 262:  
  255. 263:         #netteBluescreen pre.dump span {
  256. 264:             color: #c16549;
  257. 265:         }
  258. 266:  
  259. 267:         #netteBluescreen pre.dump a {
  260. 268:             color: #333;
  261. 269:         }
  262. 270:  
  263. 271:         #netteBluescreen div.panel {
  264. 272:             border-bottom: 1px solid #eee;
  265. 273:             padding: 1px 2em;
  266. 274:         }
  267. 275:  
  268. 276:         #netteBluescreen div.inner {
  269. 277:             padding: 0.1em 1em 1em;
  270. 278:             background: #f5f5f5;
  271. 279:         }
  272. 280:  
  273. 281:         #netteBluescreen table {
  274. 282:             border-collapse: collapse;
  275. 283:             width: 100%;
  276. 284:         }
  277. 285:  
  278. 286:         #netteBluescreen td, #netteBluescreen th {
  279. 287:             vertical-align: top;
  280. 288:             text-align: left;
  281. 289:             padding: 2px 3px;
  282. 290:             border: 1px solid #eeeebb;
  283. 291:         }
  284. 292:  
  285. 293:         #netteBluescreen th {
  286. 294:             width: 10%;
  287. 295:             font-weight: bold;
  288. 296:         }
  289. 297:  
  290. 298:         #netteBluescreen .odd, #netteBluescreen .odd pre {
  291. 299:             background-color: #faf5c3;
  292. 300:         }
  293. 301:  
  294. 302:         #netteBluescreen ul {
  295. 303:             font: 7pt/1.5 Verdana, sans-serif !important;
  296. 304:             padding: 1em 2em 50px;
  297. 305:         }
  298. 306:  
  299. 307:         #netteBluescreen .highlight, #netteBluescreenError {
  300. 308:             background: red;
  301. 309:             color: white;
  302. 310:             font-weight: bold;
  303. 311:             font-style: normal;
  304. 312:             display: block;
  305. 313:         }
  306. 314:  
  307. 315:         #netteBluescreen .line {
  308. 316:             color: #9e9e7e;
  309. 317:             font-weight: normal;
  310. 318:             font-style: normal;
  311. 319:         }
  312. 320:  
  313. 321:     /* ]]> */
  314. 322:     </style>
  315. 323:  
  316. 324:  
  317. 325:     <script type="text/javascript">
  318. 326:     /* <![CDATA[ */
  319. 327:         document.write('<style> .collapsed { display: none; } <\/style>');
  320. 328:  
  321. 329:         function netteToggle(link, panelId)
  322. 330:         {
  323. 331:             var arrow = link.getElementsByTagName('abbr')[0];
  324. 332:             var panel = panelId ? document.getElementById(panelId) : link.nextSibling;
  325. 333:             while (panel.nodeType !== 1) panel = panel.nextSibling;
  326. 334:             var collapsed = panel.currentStyle ? panel.currentStyle.display == 'none' : getComputedStyle(panel, null).display == 'none';
  327. 335:  
  328. 336:             arrow.innerHTML = String.fromCharCode(collapsed ? 0x25bc : 0x25ba);
  329. 337:             panel.style.display = collapsed ? (panel.tagName.toLowerCase() === 'code' ? 'inline' : 'block') : 'none';
  330. 338:  
  331. 339:             return true;
  332. 340:         }
  333. 341:     /* ]]> */
  334. 342:     </script>
  335. 343: </head>
  336. 344:  
  337. 345:  
  338. 346:  
  339. 347: <body>
  340. 348: <div id="netteBluescreen">
  341. 349:     <a id="netteBluescreenIcon" href="#" onclick="return !netteToggle(this)"><abbr>&#x25bc;</abbr></a
  342. 350:  
  343. 351:     ><div>
  344. 352:         <div id="netteBluescreenError" class="panel">
  345. 353:             <h1><?php echo htmlspecialchars($title)($exception->getCode(' #' $exception->getCode(''?></h1>
  346. 354:  
  347. 355:             <p><?php echo htmlspecialchars($exception->getMessage()) ?></p>
  348. 356:         </div>
  349. 357:  
  350. 358:  
  351. 359:  
  352. 360:         <?php $ex $exception$level 0?>
  353. 361:         <?php do ?>
  354. 362:  
  355. 363:             <?php if ($level++)?>
  356. 364:                 <?php _netteOpenPanel('Caused by'TRUE?>
  357. 365:                 <div class="panel">
  358. 366:                     <h1><?php echo htmlspecialchars(get_class($ex))($ex->getCode(' #' $ex->getCode(''?></h1>
  359. 367:  
  360. 368:                     <p><?php echo htmlspecialchars($ex->getMessage()) ?></p>
  361. 369:                 </div>
  362. 370:             <?php endif ?>
  363. 371:  
  364. 372:             <?php $collapsed isset($internals[$ex->getFile()])?>
  365. 373:             <?php if (is_file($ex->getFile()))?>
  366. 374:             <?php _netteOpenPanel('Source file'$collapsed?>
  367. 375:                 <p><strong>File:</strong> <?php echo htmlspecialchars($ex->getFile()) ?> &nbsp; <strong>Line:</strong> <?php echo $ex->getLine(?></p>
  368. 376:                 <pre><?php _netteDebugPrintCode($ex->getFile()$ex->getLine()) ?></pre>
  369. 377:             <?php _netteClosePanel(?>
  370. 378:             <?php endif?>
  371. 379:  
  372. 380:  
  373. 381:  
  374. 382:             <?php _netteOpenPanel('Call stack'FALSE?>
  375. 383:                 <ol>
  376. 384:                     <?php foreach ($ex->getTrace(as $key => $row)?>
  377. 385:                     <li><p>
  378. 386:  
  379. 387:                     <?php if (isset($row['file']))?>
  380. 388:                         <span title="<?php echo htmlSpecialChars($row['file'])?>"><?php echo htmlSpecialChars(basename(dirname($row['file'])))'/<b>'htmlSpecialChars(basename($row['file']))'</b></span> ('$row['line']')' ?>
  381. 389:                     <?php else?>
  382. 390:                         &lt;PHP inner-code&gt;
  383. 391:                     <?php endif ?>
  384. 392:  
  385. 393:                     <?php if (isset($row['file']&& is_file($row['file']))?><a href="#" onclick="return !netteToggle(this, 'src<?php echo "$level-$key?>')">source <abbr>&#x25ba;</abbr></a>&nbsp; <?php endif ?>
  386. 394:  
  387. 395:                     <?php if (isset($row['class'])) echo $row['class'$row['type'?>
  388. 396:                     <?php echo $row['function'?>
  389. 397:  
  390. 398:                     (<?php if (!empty($row['args']))?><a href="#" onclick="return !netteToggle(this, 'args<?php echo "$level-$key?>')">arguments <abbr>&#x25ba;</abbr></a><?php endif ?>)
  391. 399:                     </p>
  392. 400:  
  393. 401:                     <?php if (!empty($row['args']))?>
  394. 402:                         <div class="collapsed" id="args<?php echo "$level-$key?>">
  395. 403:                         <table>
  396. 404:                         <?php
  397. 405:                         try {
  398. 406:                             $r isset($row['class']new ReflectionMethod($row['class']$row['function']new ReflectionFunction($row['function']);
  399. 407:                             $params $r->getParameters();
  400. 408:                         catch (Exception $e{
  401. 409:                             $params array();
  402. 410:                         }
  403. 411:                         foreach ($row['args'as $k => $v{
  404. 412:                             echo '<tr><th>'(isset($params[$k]'$' $params[$k]->name "#$k")'</th><td>';
  405. 413:                             echo _netteDump($v);
  406. 414:                             echo "</td></tr>\n";
  407. 415:                         }
  408. 416:                         ?>
  409. 417:                         </table>
  410. 418:                         </div>
  411. 419:                     <?php endif ?>
  412. 420:  
  413. 421:  
  414. 422:                     <?php if (isset($row['file']&& is_file($row['file']))?>
  415. 423:                         <pre <?php if (!$collapsed || isset($internals[$row['file']])) echo 'class="collapsed"'else $collapsed FALSE ?> id="src<?php echo "$level-$key?>"><?php _netteDebugPrintCode($row['file']$row['line']?></pre>
  416. 424:                     <?php endif ?>
  417. 425:  
  418. 426:                     </li>
  419. 427:                     <?php endforeach ?>
  420. 428:  
  421. 429:                     <?php if (!isset($row)):?>
  422. 430:                     <li><i>empty</i></li>
  423. 431:                     <?php endif ?>
  424. 432:                 </ol>
  425. 433:             <?php _netteClosePanel(?>
  426. 434:  
  427. 435:  
  428. 436:  
  429. 437:             <?php if ($ex instanceof IDebuggable)?>
  430. 438:             <?php foreach ($ex->getPanels(as $name => $panel)?>
  431. 439:             <?php _netteOpenPanel($nameempty($panel['expanded'])) ?>
  432. 440:                 <?php echo $panel['content'?>
  433. 441:             <?php _netteClosePanel(?>
  434. 442:             <?php endforeach ?>
  435. 443:             <?php endif ?>
  436. 444:  
  437. 445:  
  438. 446:  
  439. 447:             <?php if (isset($ex->context&& is_array($ex->context)):?>
  440. 448:             <?php _netteOpenPanel('Variables'TRUE?>
  441. 449:             <table>
  442. 450:             <?php
  443. 451:             foreach ($ex->context as $k => $v{
  444. 452:                 echo '<tr><th>$'htmlspecialchars($k)'</th><td>'_netteDump($v)"</td></tr>\n";
  445. 453:             }
  446. 454:             ?>
  447. 455:             </table>
  448. 456:             <?php _netteClosePanel(?>
  449. 457:             <?php endif ?>
  450. 458:  
  451. 459:         <?php while ((method_exists($ex'getPrevious'&& $ex $ex->getPrevious()) || (isset($ex->previous&& $ex $ex->previous))?>
  452. 460:         <?php while (--$level_netteClosePanel(?>
  453. 461:  
  454. 462:  
  455. 463:  
  456. 464:         <?php if (!empty($application)):?>
  457. 465:         <?php _netteOpenPanel('Nette Application'TRUE?>
  458. 466:             <h3>Requests</h3>
  459. 467:             <?php echo _netteDump($application->getRequests()) ?>
  460. 468:  
  461. 469:             <h3>Presenter</h3>
  462. 470:             <?php echo _netteDump($application->getPresenter()) ?>
  463. 471:         <?php _netteClosePanel(?>
  464. 472:         <?php endif ?>
  465. 473:  
  466. 474:  
  467. 475:  
  468. 476:         <?php _netteOpenPanel('Environment'TRUE?>
  469. 477:             <?php
  470. 478:             $list get_defined_constants(TRUE);
  471. 479:             if (!empty($list['user'])):?>
  472. 480:             <h3><a href="#" onclick="return !netteToggle(this, 'pnl-env-const')">Constants <abbr>&#x25bc;</abbr></a></h3>
  473. 481:             <table id="pnl-env-const">
  474. 482:             <?php
  475. 483:             foreach ($list['user'as $k => $v{
  476. 484:                 echo '<tr'.($rn++%2?' class="odd"':'').'><th>'htmlspecialchars($k)'</th>';
  477. 485:                 echo '<td>'_netteDump($v)"</td></tr>\n";
  478. 486:             }
  479. 487:             ?>
  480. 488:             </table>
  481. 489:             <?php endif ?>
  482. 490:  
  483. 491:  
  484. 492:             <h3><a href="#" onclick="return !netteToggle(this, 'pnl-env-files')">Included files <abbr>&#x25ba;</abbr></a>(<?php echo count(get_included_files()) ?>)</h3>
  485. 493:             <table id="pnl-env-files" class="collapsed">
  486. 494:             <?php
  487. 495:             foreach (get_included_files(as $v{
  488. 496:                 echo '<tr'.($rn++%2?' class="odd"':'').'><td>'htmlspecialchars($v)"</td></tr>\n";
  489. 497:             }
  490. 498:             ?>
  491. 499:             </table>
  492. 500:  
  493. 501:  
  494. 502:             <h3>$_SERVER</h3>
  495. 503:             <?php if (empty($_SERVER)):?>
  496. 504:             <p><i>empty</i></p>
  497. 505:             <?php else?>
  498. 506:             <table>
  499. 507:             <?php
  500. 508:             foreach ($_SERVER as $k => $vecho '<tr'.($rn++%2?' class="odd"':'').'><th>'htmlspecialchars($k)'</th><td>'_netteDump($v)"</td></tr>\n";
  501. 509:             ?>
  502. 510:             </table>
  503. 511:             <?php endif ?>
  504. 512:         <?php _netteClosePanel(?>
  505. 513:  
  506. 514:  
  507. 515:  
  508. 516:         <?php _netteOpenPanel('HTTP request'TRUE?>
  509. 517:             <?php if (function_exists('apache_request_headers'))?>
  510. 518:             <h3>Headers</h3>
  511. 519:             <table>
  512. 520:             <?php
  513. 521:             foreach (apache_request_headers(as $k => $vecho '<tr'.($rn++%2?' class="odd"':'').'><th>'htmlspecialchars($k)'</th><td>'htmlspecialchars($v)"</td></tr>\n";
  514. 522:             ?>
  515. 523:             </table>
  516. 524:             <?php endif ?>
  517. 525:  
  518. 526:  
  519. 527:             <?php foreach (array('_GET''_POST''_COOKIE'as $name)?>
  520. 528:             <h3>$<?php echo $name ?></h3>
  521. 529:             <?php if (empty($GLOBALS[$name])):?>
  522. 530:             <p><i>empty</i></p>
  523. 531:             <?php else?>
  524. 532:             <table>
  525. 533:             <?php
  526. 534:             foreach ($GLOBALS[$nameas $k => $vecho '<tr'.($rn++%2?' class="odd"':'').'><th>'htmlspecialchars($k)'</th><td>'_netteDump($v)"</td></tr>\n";
  527. 535:             ?>
  528. 536:             </table>
  529. 537:             <?php endif ?>
  530. 538:             <?php endforeach ?>
  531. 539:         <?php _netteClosePanel(?>
  532. 540:  
  533. 541:  
  534. 542:  
  535. 543:         <?php _netteOpenPanel('HTTP response'TRUE?>
  536. 544:             <h3>Headers</h3>
  537. 545:             <?php if (headers_list())?>
  538. 546:             <pre><?php
  539. 547:             foreach (headers_list(as $secho htmlspecialchars($s)'<br>';
  540. 548:             ?></pre>
  541. 549:             <?php else?>
  542. 550:             <p><i>no headers</i></p>
  543. 551:             <?php endif ?>
  544. 552:         <?php _netteClosePanel(?>
  545. 553:  
  546. 554:  
  547. 555:         <ul>
  548. 556:             <?php foreach ($colophons as $callback)?>
  549. 557:             <?php foreach ((array) call_user_func($callback'bluescreen'as $line)?><li><?php echo $line"\n" ?></li><?php endforeach ?>
  550. 558:             <?php endforeach ?>
  551. 559:         </ul>
  552. 560:     </div>
  553. 561: </div>
  554. 562:  
  555. 563: <script type="text/javascript">
  556. 564:     document.body.appendChild(document.getElementById('netteBluescreen'));
  557. 565: </script>
  558. 566: </body>
  559. 567: </html>