debug.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. use Luracast\Restler\Restler;
  3. use Luracast\Restler\Util;
  4. $template_vars = $data;//get_defined_vars();
  5. unset($template_vars['response']);
  6. unset($template_vars['api']);
  7. unset($template_vars['request']);
  8. unset($template_vars['stages']);
  9. $template_vars['request'] = $data['request'];
  10. $template_vars['stages'] = $data['stages'];
  11. $call_trace = '';
  12. function exceptions()
  13. {
  14. global $call_trace;
  15. $r = Util::$restler;
  16. $source = $r->_exceptions;
  17. if (count($source)) {
  18. $source = end($source);
  19. $traces = array();
  20. do {
  21. $traces += $source->getTrace();
  22. } while ($source = $source->getPrevious());
  23. $traces += debug_backtrace();
  24. $call_trace
  25. = parse_backtrace($traces, 0);
  26. } else {
  27. $call_trace
  28. = parse_backtrace(debug_backtrace());
  29. }
  30. }
  31. exceptions();
  32. function parse_backtrace($raw, $skip = 1)
  33. {
  34. $output = "";
  35. foreach ($raw as $entry) {
  36. if ($skip-- > 0) {
  37. continue;
  38. }
  39. //$output .= print_r($entry, true) . "\n";
  40. $output .= "\nFile: " . $entry['file'] . " (Line: " . $entry['line'] . ")\n";
  41. if (isset($entry['class']))
  42. $output .= $entry['class'] . "::";
  43. $output .= $entry['function']
  44. . "( " . json_encode($entry['args']) . " )\n";
  45. }
  46. return $output;
  47. }
  48. //print_r(get_defined_vars());
  49. //print_r($response);
  50. $icon;
  51. if ($success && isset($api)) {
  52. $arguments = implode(', ', $api->parameters);
  53. $icon = "<icon class=\"success\"></icon>";
  54. $title = "{$api->className}::"
  55. . "{$api->methodName}({$arguments})";
  56. } else {
  57. if (isset($response['error']['message'])) {
  58. $icon = '<icon class="denied"></icon>';
  59. $title = end(explode(':',$response['error']['message'],2));
  60. } else {
  61. $icon = '<icon class="warning"></icon>';
  62. $title = 'No Matching Resource';
  63. }
  64. }
  65. function render($data, $shadow=true)
  66. {
  67. $r = '';
  68. if (empty($data))
  69. return $r;
  70. $r .= $shadow ? "<ul class=\"shadow\">\n": "<ul>\n";
  71. if (is_array($data)) {
  72. // field name
  73. foreach ($data as $key => $value) {
  74. $r .= '<li>';
  75. $r .= is_numeric($key)
  76. ? "<strong>[$key]</strong> "
  77. : "<strong>$key: </strong>";
  78. $r .= '<span>';
  79. if (is_array($value)) {
  80. // recursive
  81. $r .= render($value,false);
  82. } else {
  83. // value, with hyperlinked hyperlinks
  84. if (is_bool($value)) {
  85. $value = $value ? 'true' : 'false';
  86. }
  87. $value = htmlentities($value, ENT_COMPAT, 'UTF-8');
  88. if (strpos($value, 'http://') === 0) {
  89. $r .= '<a href="' . $value . '">' . $value . '</a>';
  90. } else {
  91. $r .= $value;
  92. }
  93. }
  94. $r .= "</span></li>\n";
  95. }
  96. } elseif (is_bool($data)) {
  97. $r .= '<li>' . ($data ? 'true' : 'false') . '</li>';
  98. } else {
  99. $r .= "<li><strong>$data</strong></li>";
  100. }
  101. $r .= "</ul>\n";
  102. return $r;
  103. }
  104. $reqHeadersArr = array();
  105. $requestHeaders = $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . PHP_EOL;
  106. foreach ($reqHeadersArr as $key => $value) {
  107. if ($key == 'Host')
  108. continue;
  109. $requestHeaders .= "$key: $value" . PHP_EOL;
  110. }
  111. // $requestHeaders = $this->encode(apache_request_headers(), FALSE,
  112. // FALSE);
  113. $responseHeaders = implode(PHP_EOL, headers_list()).PHP_EOL.'Status: HTTP/1.1 ';
  114. $responseHeaders .= Util::$restler->responseCode.' '.\Luracast\Restler\RestException::$codes[Util::$restler->responseCode];
  115. ?>
  116. <!DOCTYPE html>
  117. <html>
  118. <head>
  119. <title><?php echo $title?></title>
  120. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  121. <style>
  122. <?php include __DIR__.'/debug.css'; ?>
  123. </style>
  124. </head>
  125. <body>
  126. <div id="breadcrumbs-one">
  127. <?php
  128. if(Util::$restler->exception){
  129. $stages = Util::$restler->exception->getStages();
  130. $curStage = Util::$restler->exception->getStage();
  131. foreach($stages['success'] as $stage){
  132. echo "<a href=\"#\">$stage</a>";
  133. }
  134. foreach($stages['failure'] as $stage){
  135. echo '<a href="#" class="failure">'
  136. . $stage
  137. . ($stage==$curStage ? ' <span class="state"/> ' : '')
  138. . '</a>';
  139. }
  140. } else {
  141. foreach(Util::$restler->_events as $stage){
  142. echo "<a href=\"#\">$stage</a>";
  143. }
  144. }
  145. ?>
  146. </div>
  147. <header>
  148. <h1><?php echo $title ?></h1>
  149. </header>
  150. <article>
  151. <h2>Response:<right><?php echo $icon;?></right></h2>
  152. <pre class="header"><?php echo $responseHeaders ?></pre>
  153. <?php echo render($response); ?>
  154. <h2>Additional Template Data:</h2>
  155. <?php echo render($template_vars); ?>
  156. <p>Restler v<?php echo Restler::VERSION?></p>
  157. </article>
  158. </body>
  159. </html>