8000 [HttpKernel] Add a \"short\" trace header format, make header configu… · symfony/symfony@9a2fcc9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9a2fcc9

Browse files
mpdudenicolas-grekas
authored andcommitted
[HttpKernel] Add a \"short\" trace header format, make header configurable
1 parent 65b46a5 commit 9a2fcc9

File tree

5 files changed

+76
-4
lines changed

5 files changed

+76
-4
lines changed

src/Symfony/Component/HttpKernel/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ CHANGELOG
2424
* renamed `GetResponseForExceptionEvent` to `ExceptionEvent`
2525
* renamed `PostResponseEvent` to `TerminateEvent`
2626
* added `HttpClientKernel` for handling requests with an `HttpClientInterface` instance
27+
* added `trace_header` and `trace_level` configuration options to `HttpCache`
2728

2829
4.2.0
2930
-----

src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,14 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
4040
*
4141
* The available options are:
4242
*
43-
* * debug: If true, the traces are added as a HTTP header to ease debugging
43+
* * debug If true, exceptions are thrown when things go wrong. Otherwise, the cache
44+
* will try to carry on and deliver a meaningful response.
45+
*
46+
* * trace_level May be one of 'none', 'short' and 'full'. For 'short', a concise trace of the
47+
* master request will be added as an HTTP header. 'full' will add traces for all
48+
* requests (including ESI subrequests). (default: 'full' if in debug; 'none' otherwise)
49+
*
50+
* * trace_header Header name to use for traces. (default: X-Symfony-Cache)
4451
*
4552
* * default_ttl The number of seconds that a cache entry should be considered
4653
* fresh when no explicit freshness information is provided in
@@ -87,7 +94,13 @@ public function __construct(HttpKernelInterface $kernel, StoreInterface $store,
8794
'allow_revalidate' => false,
8895
'stale_while_revalidate' => 2,
8996
'stale_if_error' => 60,
97+
'trace_level' => 'none',
98+
'trace_header' => 'X-Symfony-Cache',
9099
], $options);
100+
101+
if (!isset($options['trace_level']) && $this->options['debug']) {
102+
$this->options['trace_level'] = 'full';
103+
}
91104
}
92105

93106
/**
@@ -110,6 +123,23 @@ public function getTraces()
110123
return $this->traces;
111124
}
112125

126+
private function addTraces(Response $response)
127+
{
128+
$traceString = null;
129+
130+
if ('full' === $this->options['trace_level']) {
131+
$traceString = $this->getLog();
132+
}
133+
134+
if ('short' === $this->options['trace_level'] && $masterId = array_key_first($this->traces)) {
135+
$traceString = implode('/', $this->traces[$masterId]);
136+
}
137+
138+
if (null !== $traceString) {
139+
$response->headers->add([$this->options['trace_header'] => $traceString]);
140+
}
141+
}
142+
113143
/**
114144
* Returns a log message for the events of the last request processing.
115145
*
@@ -194,8 +224,8 @@ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQ
194224

195225
$this->restoreResponseBody($request, $response);
196226

197-
if (HttpKernelInterface::MASTER_REQUEST === $type && $this->options['debug']) {
198-
$response->headers->set('X-Symfony-Cache', $this->getLog());
227+
if (HttpKernelInterface::MASTER_REQUEST === $type) {
228+
$this->addTraces($response);
199229
}
200230

201231
if (null !== $this->surrogate) {

src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,44 @@ public function testUsesOriginalRequestForSurrogate()
15081508
// Surrogate request
15091509
$cache->handle($request, HttpKernelInterface::SUB_REQUEST);
15101510
}
1511+
1512+
public function testTraceHeaderNameCanBeChanged()
1513+
{
1514+
$this->cacheConfig['trace_header'] = 'X-My-Header';
1515+
$this->setNextResponse();
1516+
$this->request('GET', '/');
1517+
1518+
$this->assertTrue($this->response->headers->has('X-My-Header'));
1519+
}
1520+
1521+
public function testTraceLevelDefaultsToFullIfDebug()
1522+
{
1523+
$this->setNextResponse();
1524+
$this->request('GET', '/');
1525+
1526+
$this->assertTrue($this->response->headers->has('X-Symfony-Cache'));
1527+
$this->assertEquals('GET /: miss', $this->response->headers->get('X-Symfony-Cache'));
1528+
}
1529+
1530+
public function testTraceLevelDefaultsToNoneIfNotDebug()
1531+
{
1532+
$this->cacheConfig['debug'] = false;
1533+
$this->setNextResponse();
1534+
$this->request('GET', '/');
1535+
1536+
$this->assertFalse($this->response->headers->has('X-Symfony-Cache'));
1537+
}
1538+
1539+
public function testTraceLevelShort()
1540+
{
1541+
$this->cacheConfig['trace_level'] = 'short';
1542+
1543+
$this->setNextResponse();
1544+
$this->request('GET', '/');
1545+
1546+
$this->assertTrue($this->response->headers->has('X-Symfony-Cache'));
1547+
$this->assertEquals('miss', $this->response->headers->get('X-Symfony-Cache'));
1548+
}
15111549
}
15121550

15131551
class TestKernel implements HttpKernelInterface

src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ public function request($method, $uri = '/', $server = [], $cookies = [], $esi =
122122

123123
$this->store = new Store(sys_get_temp_dir().'/http_cache');
124124

125-
$this->cacheConfig['debug'] = true;
125+
if (!isset($this->cacheConfig['debug'])) {
126+
$this->cacheConfig['debug'] = true;
127+
}
126128

127129
$this->esi = $esi ? new Esi() : null;
128130
$this->cache = new HttpCache($this->kernel, $this->store, $this->esi, $this->cacheConfig);

src/Symfony/Component/HttpKernel/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"symfony/http-foundation": "^4.1.1",
2323
"symfony/debug": "~3.4|~4.0",
2424
"symfony/polyfill-ctype": "~1.8",
25+
"symfony/polyfill-php73": "^1.9",
2526
"psr/log": "~1.0"
2627
},
2728
"require-dev": {

0 commit comments

Comments
 (0)
0