Skip to content

Commit

Permalink
bug symfony#17744 Improve error reporting in router panel of web prof…
Browse files Browse the repository at this point in the history
…iler (javiereguiluz)

This PR was squashed before being merged into the 2.7 branch (closes symfony#17744).

Discussion
----------

Improve error reporting in router panel of web profiler

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | symfony#17342
| License       | MIT
| Doc PR        | -

### Problem

If you define a route condition like this:

```yaml
app:
    resource: '@AppBundle/Controller/'
    type:     annotation
    condition: "request.server.get('HTTP_HOST') matches '/.*\.dev/'"
```

When browsing the Routing panel in the web profiler, you see an exception:

![problem](https://cloud.githubusercontent.com/assets/73419/12930027/553eeb08-cf76-11e5-90b1-ab0de6175d4e.png)

#### Why?

Because the route condition uses the `request` object, but the special `TraceableUrlMatcher` class doesn't get access to the real `request` object but to the special object obtained via:

```php
$request = $profile->getCollector('request');
```

These are the contents of this pseudo-request:

![cause](https://cloud.githubusercontent.com/assets/73419/12930052/804ea248-cf76-11e5-9c38-2e43e1654065.png)

`request.server.get(...)` condition fails because `request.server` is `null`. The full exception message shows this:

![exception](https://cloud.githubusercontent.com/assets/73419/12930079/9c7d6058-cf76-11e5-8eeb-45f5059c824c.png)

### Solution

I propose to catch all exceptions in `TraceableUrlMatcher` and display an error message with some details of the exception:

![error_message](https://cloud.githubusercontent.com/assets/73419/12930106/b29e31d2-cf76-11e5-868c-98d8b0cc4e5b.png)

Commits
-------

1001554 Improve error reporting in router panel of web profiler
  • Loading branch information
fabpot committed Mar 3, 2016
2 parents 82e58ac + 45d76df commit 441a898
Showing 1 changed file with 29 additions and 5 deletions.
34 changes: 29 additions & 5 deletions Controller/RouterController.php
Expand Up @@ -18,6 +18,7 @@
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;

/**
* RouterController.
Expand Down Expand Up @@ -62,16 +63,39 @@ public function panelAction($token)

$profile = $this->profiler->loadProfile($token);

$context = $this->matcher->getContext();
$context->setMethod($profile->getMethod());
$matcher = new TraceableUrlMatcher($this->routes, $context);

/** @var RequestDataCollector $request */
$request = $profile->getCollector('request');

return new Response($this->twig->render('@WebProfiler/Router/panel.html.twig', array(
'request' => $request,
'router' => $profile->getCollector('router'),
'traces' => $matcher->getTraces($request->getPathInfo()),
'traces' => $this->getTraces($request, $profile->getMethod()),
)), 200, array('Content-Type' => 'text/html'));
}

/**
* Returns the routing traces associated to the given request.
*
* @param RequestDataCollector $request
* @param string $method
*
* @return array
*/
private function getTraces(RequestDataCollector $request, $method)
{
$traceRequest = Request::create(
$request->getPathInfo(),
$request->getRequestServer()->get('REQUEST_METHOD'),
$request->getRequestAttributes()->all(),
$request->getRequestCookies()->all(),
array(),
$request->getRequestServer()->all()
);

$context = $this->matcher->getContext();
$context->setMethod($method);
$matcher = new TraceableUrlMatcher($this->routes, $context);

return $matcher->getTracesForRequest($traceRequest);
}
}

0 comments on commit 441a898

Please sign in to comment.