RequestExecuteAction.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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\httpclient\debug;
  8. use yii\base\Action;
  9. use yii\web\HttpException;
  10. use yii\web\Response;
  11. /**
  12. * RequestExecuteAction executes HTTP request and passes its result to the browser.
  13. *
  14. * @author Paul Klimov <klimov.paul@gmail.com>
  15. * @since 2.0
  16. */
  17. class RequestExecuteAction extends Action
  18. {
  19. /**
  20. * @var HttpClientPanel
  21. */
  22. public $panel;
  23. /**
  24. * @param string $seq
  25. * @param string $tag
  26. * @param bool $passthru whether to send response to the browser or render it as plain text
  27. * @return Response
  28. * @throws HttpException
  29. */
  30. public function run($seq, $tag, $passthru = false)
  31. {
  32. $this->controller->loadData($tag);
  33. $timings = $this->panel->calculateTimings();
  34. if (!isset($timings[$seq])) {
  35. throw new HttpException(404, 'Log message not found.');
  36. }
  37. $requestInfo = $timings[$seq]['info'];
  38. $httpRequest = $this->createRequestFromLog($requestInfo);
  39. $httpResponse = $httpRequest->send();
  40. $httpResponse->getHeaders()->get('content-type');
  41. $response = new Response([
  42. 'format' => Response::FORMAT_RAW,
  43. ]);
  44. if ($passthru) {
  45. foreach ($httpResponse->getHeaders() as $name => $value) {
  46. $response->getHeaders()->set($name, $value);
  47. }
  48. $response->content = $httpResponse->content;
  49. return $response;
  50. }
  51. $response->getHeaders()->add('content-type', 'text/plain');
  52. $response->content = $httpResponse->toString();
  53. return $response;
  54. }
  55. /**
  56. * Creates an HTTP request instance from log entry.
  57. * @param string $requestLog HTTP request log entry
  58. * @return \yii\httpclient\Request request instance.
  59. */
  60. protected function createRequestFromLog($requestLog)
  61. {
  62. if (strpos($requestLog, "\n\n")) {
  63. list($head, $content) = explode("\n\n", $requestLog, 2);
  64. } else {
  65. $head = $requestLog;
  66. $content = null;
  67. }
  68. $headers = explode("\n", $head);
  69. $main = array_shift($headers);
  70. list($method, $url) = explode(' ', $main, 2);
  71. return $this->panel->getHttpClient()->createRequest()
  72. ->setMethod($method)
  73. ->setUrl($url)
  74. ->setHeaders($headers)
  75. ->setContent($content);
  76. }
  77. }