RequestPanel.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /**
  3. * @link http://www.yiiframework.com/
  4. * @copyright Copyright (c) 2008 Yii Software LLC
  5. * @license http://www.yiiframework.com/license/
  6. */
  7. namespace yii\debug\panels;
  8. use Yii;
  9. use yii\base\InlineAction;
  10. use yii\debug\Panel;
  11. /**
  12. * Debugger panel that collects and displays request data.
  13. *
  14. * @author Qiang Xue <qiang.xue@gmail.com>
  15. * @since 2.0
  16. */
  17. class RequestPanel extends Panel
  18. {
  19. /**
  20. * @var array list of the PHP predefined variables that are allowed to be displayed in the request panel.
  21. * Note that a variable must be accessible via `$GLOBALS`. Otherwise it won't be displayed.
  22. * @since 2.0.10
  23. */
  24. public $displayVars = ['_SERVER', '_GET', '_POST', '_COOKIE', '_FILES', '_SESSION'];
  25. /**
  26. * @inheritdoc
  27. */
  28. public function getName()
  29. {
  30. return 'Request';
  31. }
  32. /**
  33. * @inheritdoc
  34. */
  35. public function getSummary()
  36. {
  37. return Yii::$app->view->render('panels/request/summary', ['panel' => $this]);
  38. }
  39. /**
  40. * @inheritdoc
  41. */
  42. public function getDetail()
  43. {
  44. return Yii::$app->view->render('panels/request/detail', ['panel' => $this]);
  45. }
  46. /**
  47. * @inheritdoc
  48. */
  49. public function save()
  50. {
  51. $headers = Yii::$app->getRequest()->getHeaders();
  52. $requestHeaders = [];
  53. foreach ($headers as $name => $value) {
  54. if (is_array($value) && count($value) == 1) {
  55. $requestHeaders[$name] = current($value);
  56. } else {
  57. $requestHeaders[$name] = $value;
  58. }
  59. }
  60. $responseHeaders = [];
  61. foreach (headers_list() as $header) {
  62. if (($pos = strpos($header, ':')) !== false) {
  63. $name = substr($header, 0, $pos);
  64. $value = trim(substr($header, $pos + 1));
  65. if (isset($responseHeaders[$name])) {
  66. if (!is_array($responseHeaders[$name])) {
  67. $responseHeaders[$name] = [$responseHeaders[$name], $value];
  68. } else {
  69. $responseHeaders[$name][] = $value;
  70. }
  71. } else {
  72. $responseHeaders[$name] = $value;
  73. }
  74. } else {
  75. $responseHeaders[] = $header;
  76. }
  77. }
  78. if (Yii::$app->requestedAction) {
  79. if (Yii::$app->requestedAction instanceof InlineAction) {
  80. $action = get_class(Yii::$app->requestedAction->controller) . '::' . Yii::$app->requestedAction->actionMethod . '()';
  81. } else {
  82. $action = get_class(Yii::$app->requestedAction) . '::run()';
  83. }
  84. } else {
  85. $action = null;
  86. }
  87. $data = [
  88. 'flashes' => $this->getFlashes(),
  89. 'statusCode' => Yii::$app->getResponse()->getStatusCode(),
  90. 'requestHeaders' => $requestHeaders,
  91. 'responseHeaders' => $responseHeaders,
  92. 'route' => Yii::$app->requestedAction ? Yii::$app->requestedAction->getUniqueId() : Yii::$app->requestedRoute,
  93. 'action' => $action,
  94. 'actionParams' => Yii::$app->requestedParams,
  95. 'requestBody' => Yii::$app->getRequest()->getRawBody() == '' ? [] : [
  96. 'Content Type' => Yii::$app->getRequest()->getContentType(),
  97. 'Raw' => Yii::$app->getRequest()->getRawBody(),
  98. 'Decoded to Params' => Yii::$app->getRequest()->getBodyParams(),
  99. ],
  100. ];
  101. foreach ($this->displayVars as $name) {
  102. $data[trim($name, '_')] = empty($GLOBALS[$name]) ? [] : $GLOBALS[$name];
  103. }
  104. return $data;
  105. }
  106. /**
  107. * Getting flash messages without deleting them or touching deletion counters
  108. *
  109. * @return array flash messages (key => message).
  110. */
  111. protected function getFlashes()
  112. {
  113. /* @var $session \yii\web\Session */
  114. $session = Yii::$app->has('session', true) ? Yii::$app->get('session') : null;
  115. if ($session === null || !$session->getIsActive()) {
  116. return [];
  117. }
  118. $counters = $session->get($session->flashParam, []);
  119. $flashes = [];
  120. foreach (array_keys($counters) as $key) {
  121. if (array_key_exists($key, $_SESSION)) {
  122. $flashes[$key] = $_SESSION[$key];
  123. }
  124. }
  125. return $flashes;
  126. }
  127. }