bug #20599 [WebProfilerBundle] Display multiple HTTP headers in WDT (ro0NL)
This PR was merged into the 2.7 branch.
Discussion
----------
[WebProfilerBundle] Display multiple HTTP headers in WDT
| Q | A
| ------------- | ---
| Branch? | 2.7 (partially in 3.2 already)
| Bug fix? | yes
| New feature? | no
| BC breaks? | no-ish
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | [#20595 (comment)](https://github.com/symfony/symfony/pull/20595#issuecomment-262311651)
| License | MIT
| Doc PR | reference to the documentation PR, if any
Backport of https://github.com/symfony/symfony/pull/20595 for 2.7, that includes a fix for displaying multiple HTTP headers in the WDT.
![image](https://cloud.githubusercontent.com/assets/1047696/20536902/43de2692-b0eb-11e6-8eb7-f0584daf5963.png)
//cc @nicolas-grekas this should cover 2.7 - 3.1 right?
Commits
-------
257a856
[WebProfilerBundle] Display multiple HTTP headers in WDT
This commit is contained in:
commit
f1675c2ddd
@ -12,10 +12,8 @@
|
|||||||
namespace Symfony\Component\HttpKernel\DataCollector;
|
namespace Symfony\Component\HttpKernel\DataCollector;
|
||||||
|
|
||||||
use Symfony\Component\HttpFoundation\ParameterBag;
|
use Symfony\Component\HttpFoundation\ParameterBag;
|
||||||
use Symfony\Component\HttpFoundation\HeaderBag;
|
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
|
|
||||||
use Symfony\Component\HttpKernel\KernelEvents;
|
use Symfony\Component\HttpKernel\KernelEvents;
|
||||||
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
|
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
|
||||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
@ -40,12 +38,8 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
|
|||||||
public function collect(Request $request, Response $response, \Exception $exception = null)
|
public function collect(Request $request, Response $response, \Exception $exception = null)
|
||||||
{
|
{
|
||||||
$responseHeaders = $response->headers->all();
|
$responseHeaders = $response->headers->all();
|
||||||
$cookies = array();
|
|
||||||
foreach ($response->headers->getCookies() as $cookie) {
|
foreach ($response->headers->getCookies() as $cookie) {
|
||||||
$cookies[] = $this->getCookieHeader($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
|
$responseHeaders['set-cookie'][] = (string) $cookie;
|
||||||
}
|
|
||||||
if (count($cookies) > 0) {
|
|
||||||
$responseHeaders['Set-Cookie'] = $cookies;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// attributes are serialized and as they can be anything, they need to be converted to strings.
|
// attributes are serialized and as they can be anything, they need to be converted to strings.
|
||||||
@ -121,6 +115,18 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
|
|||||||
$this->data['request_request']['_password'] = '******';
|
$this->data['request_request']['_password'] = '******';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($this->data as $key => $value) {
|
||||||
|
if (!is_array($value)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ('request_headers' === $key || 'response_headers' === $key) {
|
||||||
|
$value = array_map(function ($v) { return isset($v[0]) && !isset($v[1]) ? $v[0] : $v; }, $value);
|
||||||
|
}
|
||||||
|
if ('request_server' !== $key && 'request_cookies' !== $key) {
|
||||||
|
$this->data[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($this->controllers[$request])) {
|
if (isset($this->controllers[$request])) {
|
||||||
$controller = $this->controllers[$request];
|
$controller = $this->controllers[$request];
|
||||||
if (is_array($controller)) {
|
if (is_array($controller)) {
|
||||||
@ -183,7 +189,7 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
|
|||||||
|
|
||||||
public function getRequestHeaders()
|
public function getRequestHeaders()
|
||||||
{
|
{
|
||||||
return new HeaderBag($this->data['request_headers']);
|
return new ParameterBag($this->data['request_headers']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRequestServer()
|
public function getRequestServer()
|
||||||
@ -203,7 +209,7 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
|
|||||||
|
|
||||||
public function getResponseHeaders()
|
public function getResponseHeaders()
|
||||||
{
|
{
|
||||||
return new ResponseHeaderBag($this->data['response_headers']);
|
return new ParameterBag($this->data['response_headers']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getSessionMetadata()
|
public function getSessionMetadata()
|
||||||
@ -302,41 +308,4 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
|
|||||||
{
|
{
|
||||||
return 'request';
|
return 'request';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getCookieHeader($name, $value, $expires, $path, $domain, $secure, $httponly)
|
|
||||||
{
|
|
||||||
$cookie = sprintf('%s=%s', $name, urlencode($value));
|
|
||||||
|
|
||||||
if (0 !== $expires) {
|
|
||||||
if (is_numeric($expires)) {
|
|
||||||
$expires = (int) $expires;
|
|
||||||
} elseif ($expires instanceof \DateTime) {
|
|
||||||
$expires = $expires->getTimestamp();
|
|
||||||
} else {
|
|
||||||
$tmp = strtotime($expires);
|
|
||||||
if (false === $tmp || -1 == $tmp) {
|
|
||||||
throw new \InvalidArgumentException(sprintf('The "expires" cookie parameter is not valid (%s).', $expires));
|
|
||||||
}
|
|
||||||
$expires = $tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
$cookie .= '; expires='.str_replace('+0000', '', \DateTime::createFromFormat('U', $expires, new \DateTimeZone('GMT'))->format('D, d-M-Y H:i:s T'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($domain) {
|
|
||||||
$cookie .= '; domain='.$domain;
|
|
||||||
}
|
|
||||||
|
|
||||||
$cookie .= '; path='.$path;
|
|
||||||
|
|
||||||
if ($secure) {
|
|
||||||
$cookie .= '; secure';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($httponly) {
|
|
||||||
$cookie .= '; httponly';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $cookie;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ class RequestDataCollectorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$attributes = $c->getRequestAttributes();
|
$attributes = $c->getRequestAttributes();
|
||||||
|
|
||||||
$this->assertSame('request', $c->getName());
|
$this->assertSame('request', $c->getName());
|
||||||
$this->assertInstanceOf('Symfony\Component\HttpFoundation\HeaderBag', $c->getRequestHeaders());
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestHeaders());
|
||||||
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestServer());
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestServer());
|
||||||
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestCookies());
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestCookies());
|
||||||
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $attributes);
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $attributes);
|
||||||
@ -45,7 +45,7 @@ class RequestDataCollectorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertRegExp('/Resource\(stream#\d+\)/', $attributes->get('resource'));
|
$this->assertRegExp('/Resource\(stream#\d+\)/', $attributes->get('resource'));
|
||||||
$this->assertSame('Object(stdClass)', $attributes->get('object'));
|
$this->assertSame('Object(stdClass)', $attributes->get('object'));
|
||||||
|
|
||||||
$this->assertInstanceOf('Symfony\Component\HttpFoundation\HeaderBag', $c->getResponseHeaders());
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getResponseHeaders());
|
||||||
$this->assertSame('OK', $c->getStatusText());
|
$this->assertSame('OK', $c->getStatusText());
|
||||||
$this->assertSame(200, $c->getStatusCode());
|
$this->assertSame(200, $c->getStatusCode());
|
||||||
$this->assertSame('application/json', $c->getContentType());
|
$this->assertSame('application/json', $c->getContentType());
|
||||||
|
Reference in New Issue
Block a user