config = $config; foreach ($config->collectors as $collector) { if (! class_exists($collector)) { log_message('critical', 'Toolbar collector does not exists(' . $collector . ').' . 'please check $collectors in the Config\Toolbar.php file.'); continue; } $this->collectors[] = new $collector(); } } //-------------------------------------------------------------------- /** * Returns all the data required by Debug Bar * * @param float $startTime App start time * @param float $totalTime * @param \CodeIgniter\HTTP\RequestInterface $request * @param \CodeIgniter\HTTP\ResponseInterface $response * * @return string JSON encoded data */ public function run(float $startTime, float $totalTime, RequestInterface $request, ResponseInterface $response): string { // Data items used within the view. $data['url'] = current_url(); $data['method'] = $request->getMethod(true); $data['isAJAX'] = $request->isAJAX(); $data['startTime'] = $startTime; $data['totalTime'] = $totalTime * 1000; $data['totalMemory'] = number_format((memory_get_peak_usage()) / 1024 / 1024, 3); $data['segmentDuration'] = $this->roundTo($data['totalTime'] / 7, 5); $data['segmentCount'] = (int) ceil($data['totalTime'] / $data['segmentDuration']); $data['CI_VERSION'] = \CodeIgniter\CodeIgniter::CI_VERSION; $data['collectors'] = []; foreach ($this->collectors as $collector) { $data['collectors'][] = $collector->getAsArray(); } foreach ($this->collectVarData() as $heading => $items) { $varData = []; if (is_array($items)) { foreach ($items as $key => $value) { $varData[esc($key)] = is_string($value) ? esc($value) : print_r($value, true); } } $data['vars']['varData'][esc($heading)] = $varData; } if (! empty($_SESSION)) { foreach ($_SESSION as $key => $value) { // Replace the binary data with string to avoid json_encode failure. if (is_string($value) && preg_match('~[^\x20-\x7E\t\r\n]~', $value)) { $value = 'binary data'; } $data['vars']['session'][esc($key)] = is_string($value) ? esc($value) : print_r($value, true); } } foreach ($request->getGet() as $name => $value) { $data['vars']['get'][esc($name)] = is_array($value) ? esc(print_r($value, true)) : esc($value); } foreach ($request->getPost() as $name => $value) { $data['vars']['post'][esc($name)] = is_array($value) ? esc(print_r($value, true)) : esc($value); } foreach ($request->getHeaders() as $header => $value) { if (empty($value)) { continue; } if (! is_array($value)) { $value = [$value]; } foreach ($value as $h) { $data['vars']['headers'][esc($h->getName())] = esc($h->getValueLine()); } } foreach ($request->getCookie() as $name => $value) { $data['vars']['cookies'][esc($name)] = esc($value); } $data['vars']['request'] = ($request->isSecure() ? 'HTTPS' : 'HTTP') . '/' . $request->getProtocolVersion(); $data['vars']['response'] = [ 'statusCode' => $response->getStatusCode(), 'reason' => esc($response->getReason()), 'contentType' => esc($response->getHeaderLine('content-type')), ]; $data['config'] = \CodeIgniter\Debug\Toolbar\Collectors\Config::display(); if ($response->CSP !== null) { $response->CSP->addImageSrc('data:'); } return json_encode($data); } //-------------------------------------------------------------------- //-------------------------------------------------------------------- /** * Called within the view to display the timeline itself. * * @param array $collectors * @param float $startTime * @param integer $segmentCount * @param integer $segmentDuration * @param array $styles * * @return string */ protected function renderTimeline(array $collectors, float $startTime, int $segmentCount, int $segmentDuration, array &$styles): string { $displayTime = $segmentCount * $segmentDuration; $rows = $this->collectTimelineData($collectors); $output = ''; $styleCount = 0; foreach ($rows as $row) { $output .= '