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());
 }
Esempio n. 2
0
 /**
  * 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);
 }