3 namespace Drupal\webprofiler\DataCollector;
5 use Drupal\webprofiler\Http\HttpClientMiddleware;
6 use Drupal\webprofiler\DrupalDataCollectorInterface;
7 use Drupal\Core\StringTranslation\StringTranslationTrait;
8 use Symfony\Component\HttpFoundation\Request;
9 use Symfony\Component\HttpFoundation\Response;
10 use Symfony\Component\HttpKernel\DataCollector\DataCollector;
13 * Collects data about http calls during request.
15 class HttpDataCollector extends DataCollector implements DrupalDataCollectorInterface {
17 use StringTranslationTrait, DrupalDataCollectorTrait;
20 * @var \GuzzleHttp\Client
25 * @param \Drupal\webprofiler\Http\HttpClientMiddleware $middleware
27 public function __construct(HttpClientMiddleware $middleware) {
28 $this->middleware = $middleware;
30 $this->data['completed'] = [];
31 $this->data['failed'] = [];
37 public function collect(Request $request, Response $response, \Exception $exception = NULL) {
38 $completed = $this->middleware->getCompletedRequests();
39 $failed = $this->middleware->getFailedRequests();
41 foreach ($completed as $data) {
42 /** @var \GuzzleHttp\Psr7\Request $request */
43 $request = $data['request'];
44 /** @var \GuzzleHttp\Psr7\Response $response */
45 $response = $data['response'];
46 /** @var \GuzzleHttp\TransferStats $stats */
47 $stats = $request->stats;
49 $uri = $request->getUri();
50 $this->data['completed'][] = [
52 'method' => $request->getMethod(),
54 'schema' => $uri->getScheme(),
55 'host' => $uri->getHost(),
56 'port' => $uri->getPort(),
57 'path' => $uri->getPath(),
58 'query' => $uri->getQuery(),
59 'fragment' => $uri->getFragment(),
61 'headers' => $request->getHeaders(),
62 'protocol' => $request->getProtocolVersion(),
63 'request_target' => $request->getRequestTarget(),
65 'transferTime' => $stats->getTransferTime(),
66 'handlerStats' => $stats->getHandlerStats(),
70 'phrase' => $response->getReasonPhrase(),
71 'status' => $response->getStatusCode(),
72 'headers' => $response->getHeaders(),
73 'protocol' => $response->getProtocolVersion(),
78 foreach ($failed as $data) {
79 /** @var \GuzzleHttp\Psr7\Request $request */
80 $request = $data['request'];
81 /** @var \GuzzleHttp\Psr7\Response $response */
82 $response = $data['response'];
84 $uri = $request->getUri();
87 'method' => $request->getMethod(),
89 'schema' => $uri->getScheme(),
90 'host' => $uri->getHost(),
91 'port' => $uri->getPort(),
92 'path' => $uri->getPath(),
93 'query' => $uri->getQuery(),
94 'fragment' => $uri->getFragment(),
96 'headers' => $request->getHeaders(),
97 'protocol' => $request->getProtocolVersion(),
98 'request_target' => $request->getRequestTarget(),
103 $failureData['response'] = [
104 'phrase' => $response->getReasonPhrase(),
105 'status' => $response->getStatusCode(),
106 'headers' => $response->getHeaders(),
107 'protocol' => $response->getProtocolVersion(),
111 $this->data['failed'][] = $failureData;
118 public function getCompletedRequestsCount() {
119 return count($this->getCompletedRequests());
125 public function getCompletedRequests() {
126 return $this->data['completed'];
132 public function getFailedRequestsCount() {
133 return count($this->getFailedRequests());
139 public function getFailedRequests() {
140 return $this->data['failed'];
146 public function getName() {
153 public function getTitle() {
154 return $this->t('Http');
160 public function getPanelSummary() {
162 'Completed @completed, error @error', [
163 '@completed' => $this->getCompletedRequestsCount(),
164 '@error' => $this->getFailedRequestsCount(),
172 public function getIcon() {
173 return 'iVBORw0KGgoAAAANSUhEUgAAABUAAAAcCAYAAACOGPReAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAATlJREFUeNrsleERgjAMha0TdISOwAZ2BEZghI7ABo7AOQFuwAjoBLgBblBbfb0LudByp/4jdw+PNnxtkqYq7/3h13Y8/MF26B9spfo6yAX1QSa6EY2Y0xLrzROgddAMOcgLmuFbhDqyG00W8Rm1JWgEWCG0oQBuJKjGigNUs/xWUJdJheZQJzhZFGkgKWkw1mM8bmTCvOPQcSVXrTA+Ydc0kujXJGg6p5VwrG5BJzb2CLriN9kT74afUylPloQ+kdDPELXpg1qGvwbtURwjFGkkC8RIZw6d2QeO7MII81wRbDm0Z068Zf0G1bxQl8z1UH1zoQwk9NRZdkPoHt+KbZoqa+HYZS4T3iimdEvRDrIF4KIRclBNjk+uSB2/eBJUvR9KSek26BZHOit2zl3oqkV91P6//3N7CTAAIIc/qj2gy4gAAAAASUVORK5CYII=';