public function testCollect() { $e = new \Exception('foo', 500); $c = new ExceptionDataCollector(); $flattened = FlattenException::create($e); $trace = $flattened->getTrace(); $this->assertFalse($c->hasException()); $c->collect(new Request(), new Response(), $e); $this->assertTrue($c->hasException()); $this->assertEquals($flattened, $c->getException()); $this->assertSame('foo', $c->getMessage()); $this->assertSame(500, $c->getCode()); $this->assertSame('exception', $c->getName()); $this->assertSame($trace, $c->getTrace()); }
/** * Handle http request. * * @param HttpRequest $httpRequest * * @return HttpResponse */ public function handleHttpRequest(HttpRequest $httpRequest) { // Try parse HttpRequest to JsonRequest|JsonRequest[] try { $jsonRequests = $this->parserHttpRequest($httpRequest); } catch (Exceptions\ParseException $e) { return $this->createHttpResponseFromException($e); } $jsonResponses = $this->handleJsonRequest($jsonRequests); // Response $httpResponse = HttpResponse::create(); // Is has exception? if ($this->container && $this->container->has('profiler')) { /* @var Profile $profiler */ $profiler = $this->container->get('profiler'); if (is_array($jsonResponses)) { foreach ($jsonResponses as $jsonResponse) { if ($exception = $jsonResponse->getException()) { $collector = new ExceptionDataCollector(); $collector->collect($httpRequest, $httpResponse, $exception); $profiler->add($collector); } } } else { if ($exception = $jsonResponses->getException()) { $collector = new ExceptionDataCollector(); $collector->collect($httpRequest, $httpResponse, $exception); $profiler->add($collector); } } } // Set httpResponse content. if (is_array($jsonResponses)) { $results = []; foreach ($jsonResponses as $jsonResponse) { if ($jsonResponse->isError() || $jsonResponse->getId()) { $results[] = $jsonResponse; } if ($jsonResponse->isError()) { $httpResponse->setStatusCode(500); } } $httpResponse->setContent(json_encode($results)); } else { if ($jsonResponses->isError() || $jsonResponses->getId()) { $httpResponse->setContent(json_encode($jsonResponses)); } if ($jsonResponses->isError()) { $httpResponse->setStatusCode(500); } } // Set httpResponse headers. if (is_array($jsonResponses)) { foreach ($jsonResponses as $jsonResponse) { if ($jsonResponse->isError() || $jsonResponse->getId()) { $httpResponse->headers->add($jsonResponse->headers()->all()); } } } else { $httpResponse->headers->add($jsonResponses->headers()->all()); } $httpResponse->headers->set('Content-Type', 'application/json'); return $httpResponse; }
private function getExceptionData(ExceptionDataCollector $collector) { $exception = $collector->getException(); if (!$exception instanceof FlattenException) { $exception = FlattenException::create($exception); } $data = $exception->toArray(); foreach ($data as $nb => $exData) { // skip non-public exceptions $class = new \ReflectionClass($exData['class']); if ($class->isUserDefined() && !$this->isNamespaceWhitelisted($exData['class'])) { unset($data[$nb]); continue; } // skip built-in exceptions that are thrown from a non-public class if (!$class->isUserDefined() && (!isset($exData['trace'][1]) || !$this->isNamespaceWhitelisted($exData['trace'][1]['class']))) { unset($data[$nb]); continue; } foreach ($exData['trace'] as $key => $trace) { unset($data[$nb]['trace'][$key]['namespace'], $data[$nb]['trace'][$key]['short_class']); if ('' === $trace['class']) { $public = isset($exData['trace'][$key + 1]) && $this->isNamespaceWhitelisted($exData['trace'][$key + 1]['class']); } else { $public = $this->isNamespaceWhitelisted($trace['class']); } if (!$public) { foreach ($trace as $k => $v) { if (is_array($v)) { $data[$nb]['trace'][$key][$k] = array(); } else { if (is_string($v)) { if ('' !== $v) { $data[$nb]['trace'][$key][$k] = 'XXX'; } } else { $data[$nb]['trace'][$key][$k] = 'XXX'; } } } continue; } // additional heuristics for config data handling if ('Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' === $trace['class'] && 'parseImports' === $trace['function']) { $trace['args'] = array(array('array', array()), array('string', basename($trace['args'][1][1]))); } if ('Symfony\\Component\\Yaml\\Parser' === $trace['class'] && 'parse' === $trace['function']) { $trace['args'] = array(array('string', 'XXX')); } $data[$nb]['trace'][$key]['file'] = basename($trace['file']); $data[$nb]['trace'][$key]['args'] = $this->purgeArgsRecursive($trace['args']); } } return array_values($data); }