name: HttpCacheTest
class_comment: '# * @group time-sensitive'
dependencies:
- name: EventDispatcher
type: class
source: Symfony\Component\EventDispatcher\EventDispatcher
- name: Request
type: class
source: Symfony\Component\HttpFoundation\Request
- name: Response
type: class
source: Symfony\Component\HttpFoundation\Response
- name: TerminateEvent
type: class
source: Symfony\Component\HttpKernel\Event\TerminateEvent
- name: Esi
type: class
source: Symfony\Component\HttpKernel\HttpCache\Esi
- name: HttpCache
type: class
source: Symfony\Component\HttpKernel\HttpCache\HttpCache
- name: StoreInterface
type: class
source: Symfony\Component\HttpKernel\HttpCache\StoreInterface
- name: HttpKernelInterface
type: class
source: Symfony\Component\HttpKernel\HttpKernelInterface
- name: Kernel
type: class
source: Symfony\Component\HttpKernel\Kernel
properties: []
methods:
- name: testHttpCacheIsSetAsATrustedProxy
visibility: public
parameters:
- name: existing
comment: "# * @group time-sensitive\n# */\n# class HttpCacheTest extends HttpCacheTestCase\n\
# {\n# public function testTerminateDelegatesTerminationOnlyForTerminableInterface()\n\
# {\n# $storeMock = $this->getMockBuilder(StoreInterface::class)\n# ->disableOriginalConstructor()\n\
# ->getMock();\n# \n# // does not implement TerminableInterface\n# $kernel = new\
\ TestKernel();\n# $httpCache = new HttpCache($kernel, $storeMock);\n# $httpCache->terminate(Request::create('/'),\
\ new Response());\n# \n# $this->assertFalse($kernel->terminateCalled, 'terminate()\
\ is never called if the kernel class does not implement TerminableInterface');\n\
# \n# // implements TerminableInterface\n# $kernelMock = $this->getMockBuilder(Kernel::class)\n\
# ->disableOriginalConstructor()\n# ->onlyMethods(['terminate', 'registerBundles',\
\ 'registerContainerConfiguration'])\n# ->getMock();\n# \n# $kernelMock->expects($this->once())\n\
# ->method('terminate');\n# \n# $kernel = new HttpCache($kernelMock, $storeMock);\n\
# $kernel->terminate(Request::create('/'), new Response());\n# }\n# \n# public\
\ function testDoesNotCallTerminateOnFreshResponse()\n# {\n# $terminateEvents\
\ = [];\n# \n# $eventDispatcher = $this->createMock(EventDispatcher::class);\n\
# $eventDispatcher\n# ->expects($this->any())\n# ->method('dispatch')\n# ->with($this->callback(function\
\ ($event) use (&$terminateEvents) {\n# if ($event instanceof TerminateEvent)\
\ {\n# $terminateEvents[] = $event;\n# }\n# \n# return true;\n# }));\n# \n# $this->setNextResponse(\n\
# 200,\n# [\n# 'ETag' => '1234',\n# 'Cache-Control' => 'public, s-maxage=60',\n\
# ],\n# 'Hello World',\n# null,\n# $eventDispatcher\n# );\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# $this->cache->terminate($this->request, $this->response);\n# \n# sleep(2);\n\
# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
\ $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
# $this->assertEquals(2, $this->response->headers->get('Age'));\n# $this->cache->terminate($this->request,\
\ $this->response);\n# \n# $this->assertCount(1, $terminateEvents);\n# }\n# \n\
# public function testPassesOnNonGetHeadRequests()\n# {\n# $this->setNextResponse(200);\n\
# $this->request('POST', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n\
# $this->assertTraceContains('pass');\n# $this->assertFalse($this->response->headers->has('Age'));\n\
# }\n# \n# public function testInvalidatesOnPostPutDeleteRequests()\n# {\n# foreach\
\ (['post', 'put', 'delete'] as $method) {\n# $this->setNextResponse(200);\n#\
\ $this->request($method, '/');\n# \n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n\
# $this->assertTraceContains('invalidate');\n# $this->assertTraceContains('pass');\n\
# }\n# }\n# \n# public function testDoesNotCacheWithAuthorizationRequestHeaderAndNonPublicResponse()\n\
# {\n# $this->setNextResponse(200, ['ETag' => '\"Foo\"']);\n# $this->request('GET',\
\ '/', ['HTTP_AUTHORIZATION' => 'basic foobarbaz']);\n# \n# $this->assertHttpKernelIsCalled();\n\
# $this->assertResponseOk();\n# $this->assertEquals('private', $this->response->headers->get('Cache-Control'));\n\
# \n# $this->assertTraceContains('miss');\n# $this->assertTraceNotContains('store');\n\
# $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
\ function testDoesCacheWithAuthorizationRequestHeaderAndPublicResponse()\n# {\n\
# $this->setNextResponse(200, ['Cache-Control' => 'public', 'ETag' => '\"Foo\"\
']);\n# $this->request('GET', '/', ['HTTP_AUTHORIZATION' => 'basic foobarbaz']);\n\
# \n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertTrue($this->response->headers->has('Age'));\n\
# $this->assertEquals('public', $this->response->headers->get('Cache-Control'));\n\
# }\n# \n# public function testDoesNotCacheWithCookieHeaderAndNonPublicResponse()\n\
# {\n# $this->setNextResponse(200, ['ETag' => '\"Foo\"']);\n# $this->request('GET',\
\ '/', [], ['foo' => 'bar']);\n# \n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n\
# $this->assertEquals('private', $this->response->headers->get('Cache-Control'));\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceNotContains('store');\n\
# $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
\ function testDoesNotCacheRequestsWithACookieHeader()\n# {\n# $this->setNextResponse(200);\n\
# $this->request('GET', '/', [], ['foo' => 'bar']);\n# \n# $this->assertHttpKernelIsCalled();\n\
# $this->assertResponseOk();\n# $this->assertEquals('private', $this->response->headers->get('Cache-Control'));\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceNotContains('store');\n\
# $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
\ function testRespondsWith304WhenIfModifiedSinceMatchesLastModified()\n# {\n\
# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# \n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public', 'Last-Modified' => $time->format(\\DATE_RFC2822),\
\ 'Content-Type' => 'text/plain'], 'Hello World');\n# $this->request('GET', '/',\
\ ['HTTP_IF_MODIFIED_SINCE' => $time->format(\\DATE_RFC2822)]);\n# \n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(304, $this->response->getStatusCode());\n# $this->assertEquals('',\
\ $this->response->headers->get('Content-Type'));\n# $this->assertEmpty($this->response->getContent());\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# }\n# \n# public function testRespondsWith304WhenIfNoneMatchMatchesETag()\n#\
\ {\n# $this->setNextResponse(200, ['Cache-Control' => 'public', 'ETag' => '12345',\
\ 'Content-Type' => 'text/plain'], 'Hello World');\n# $this->request('GET', '/',\
\ ['HTTP_IF_NONE_MATCH' => '12345']);\n# \n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(304, $this->response->getStatusCode());\n# $this->assertEquals('',\
\ $this->response->headers->get('Content-Type'));\n# $this->assertTrue($this->response->headers->has('ETag'));\n\
# $this->assertEmpty($this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# }\n# \n# public function testRespondsWith304WhenIfNoneMatchAndIfModifiedSinceBothMatch()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# \n# $this->setNextResponse(200,\
\ [], '', function ($request, $response) use ($time) {\n# $response->setStatusCode(200);\n\
# $response->headers->set('ETag', '12345');\n# $response->headers->set('Last-Modified',\
\ $time->format(\\DATE_RFC2822));\n# $response->headers->set('Content-Type', 'text/plain');\n\
# $response->setContent('Hello World');\n# });\n# \n# // only ETag matches\n#\
\ $t = \\DateTimeImmutable::createFromFormat('U', time() - 3600);\n# $this->request('GET',\
\ '/', ['HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $t->format(\\\
DATE_RFC2822)]);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(304,\
\ $this->response->getStatusCode());\n# \n# // only Last-Modified matches\n# $this->request('GET',\
\ '/', ['HTTP_IF_NONE_MATCH' => '1234', 'HTTP_IF_MODIFIED_SINCE' => $time->format(\\\
DATE_RFC2822)]);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# \n# // Both matches\n# $this->request('GET',\
\ '/', ['HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $time->format(\\\
DATE_RFC2822)]);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(304,\
\ $this->response->getStatusCode());\n# }\n# \n# public function testIncrementsMaxAgeWhenNoDateIsSpecifiedEventWhenUsingETag()\n\
# {\n# $this->setNextResponse(\n# 200,\n# [\n# 'ETag' => '1234',\n# 'Cache-Control'\
\ => 'public, s-maxage=60',\n# ]\n# );\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# \n# sleep(2);\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('fresh');\n# $this->assertEquals(2, $this->response->headers->get('Age'));\n\
# }\n# \n# public function testValidatesPrivateResponsesCachedOnTheClient()\n\
# {\n# $this->setNextResponse(200, [], '', function (Request $request, $response)\
\ {\n# $etags = preg_split('/\\s*,\\s*/', $request->headers->get('IF_NONE_MATCH',\
\ ''));\n# if ($request->cookies->has('authenticated')) {\n# $response->headers->set('Cache-Control',\
\ 'private, no-store');\n# $response->setETag('\"private tag\"');\n# if (\\in_array('\"\
private tag\"', $etags, true)) {\n# $response->setStatusCode(304);\n# } else {\n\
# $response->setStatusCode(200);\n# $response->headers->set('Content-Type', 'text/plain');\n\
# $response->setContent('private data');\n# }\n# } else {\n# $response->headers->set('Cache-Control',\
\ 'public');\n# $response->setETag('\"public tag\"');\n# if (\\in_array('\"public\
\ tag\"', $etags, true)) {\n# $response->setStatusCode(304);\n# } else {\n# $response->setStatusCode(200);\n\
# $response->headers->set('Content-Type', 'text/plain');\n# $response->setContent('public\
\ data');\n# }\n# }\n# });\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('\"\
public tag\"', $this->response->headers->get('ETag'));\n# $this->assertEquals('public\
\ data', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# \n# $this->request('GET', '/', [], ['authenticated'\
\ => '']);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('\"private tag\"', $this->response->headers->get('ETag'));\n\
# $this->assertEquals('private data', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
# $this->assertTraceContains('invalid');\n# $this->assertTraceNotContains('store');\n\
# }\n# \n# public function testStoresResponsesWhenNoCacheRequestDirectivePresent()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# \n#\
\ $this->setNextResponse(200, ['Cache-Control' => 'public', 'Expires' => $time->format(\\\
DATE_RFC2822)]);\n# $this->request('GET', '/', ['HTTP_CACHE_CONTROL' => 'no-cache']);\n\
# \n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('store');\n\
# $this->assertTrue($this->response->headers->has('Age'));\n# }\n# \n# public\
\ function testReloadsResponsesWhenCacheHitsButNoCacheRequestDirectivePresentWhenAllowReloadIsSetTrue()\n\
# {\n# $count = 0;\n# \n# $this->setNextResponse(200, ['Cache-Control' => 'public,\
\ max-age=10000'], '', function ($request, $response) use (&$count) {\n# ++$count;\n\
# $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');\n# });\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
# \n# $this->cacheConfig['allow_reload'] = true;\n# $this->request('GET', '/',\
\ ['HTTP_CACHE_CONTROL' => 'no-cache']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Goodbye World', $this->response->getContent());\n# $this->assertTraceContains('reload');\n\
# $this->assertTraceContains('store');\n# }\n# \n# public function testDoesNotReloadResponsesWhenAllowReloadIsSetFalseDefault()\n\
# {\n# $count = 0;\n# \n# $this->setNextResponse(200, ['Cache-Control' => 'public,\
\ max-age=10000'], '', function ($request, $response) use (&$count) {\n# ++$count;\n\
# $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');\n# });\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
# \n# $this->cacheConfig['allow_reload'] = false;\n# $this->request('GET', '/',\
\ ['HTTP_CACHE_CONTROL' => 'no-cache']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceNotContains('reload');\n\
# \n# $this->request('GET', '/', ['HTTP_CACHE_CONTROL' => 'no-cache']);\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# $this->assertTraceNotContains('reload');\n# }\n# \n# public function testRevalidatesFreshCacheEntryWhenMaxAgeRequestDirectiveIsExceededWhenAllowRevalidateOptionIsSetTrue()\n\
# {\n# $count = 0;\n# \n# $this->setNextResponse(200, [], '', function ($request,\
\ $response) use (&$count) {\n# ++$count;\n# $response->headers->set('Cache-Control',\
\ 'public, max-age=10000');\n# $response->setETag($count);\n# $response->setContent(1\
\ == $count ? 'Hello World' : 'Goodbye World');\n# });\n# \n# $this->request('GET',\
\ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
# \n# $this->cacheConfig['allow_revalidate'] = true;\n# $this->request('GET',\
\ '/', ['HTTP_CACHE_CONTROL' => 'max-age=0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Goodbye World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
# $this->assertTraceContains('invalid');\n# $this->assertTraceContains('store');\n\
# }\n# \n# public function testDoesNotRevalidateFreshCacheEntryWhenEnableRevalidateOptionIsSetFalseDefault()\n\
# {\n# $count = 0;\n# \n# $this->setNextResponse(200, [], '', function ($request,\
\ $response) use (&$count) {\n# ++$count;\n# $response->headers->set('Cache-Control',\
\ 'public, max-age=10000');\n# $response->setETag($count);\n# $response->setContent(1\
\ == $count ? 'Hello World' : 'Goodbye World');\n# });\n# \n# $this->request('GET',\
\ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
# \n# $this->cacheConfig['allow_revalidate'] = false;\n# $this->request('GET',\
\ '/', ['HTTP_CACHE_CONTROL' => 'max-age=0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceNotContains('stale');\n\
# $this->assertTraceNotContains('invalid');\n# $this->assertTraceContains('fresh');\n\
# \n# $this->request('GET', '/', ['HTTP_CACHE_CONTROL' => 'max-age=0']);\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# $this->assertTraceNotContains('stale');\n# $this->assertTraceNotContains('invalid');\n\
# $this->assertTraceContains('fresh');\n# }\n# \n# public function testFetchesResponseFromBackendWhenCacheMisses()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public', 'Expires' => $time->format(\\DATE_RFC2822)]);\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('miss');\n# $this->assertTrue($this->response->headers->has('Age'));\n\
# }\n# \n# public function testDoesNotCacheSomeStatusCodeResponses()\n# {\n# foreach\
\ (array_merge(range(201, 202), range(204, 206), range(303, 305), range(400, 403),\
\ range(405, 409), range(411, 417), range(500, 505)) as $code) {\n# $time = \\\
DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse($code,\
\ ['Expires' => $time->format(\\DATE_RFC2822)]);\n# \n# $this->request('GET',\
\ '/');\n# $this->assertEquals($code, $this->response->getStatusCode());\n# $this->assertTraceNotContains('store');\n\
# $this->assertFalse($this->response->headers->has('Age'));\n# }\n# }\n# \n# public\
\ function testDoesNotCacheResponsesWithExplicitNoStoreDirective()\n# {\n# $time\
\ = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
\ ['Expires' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 'no-store']);\n\
# \n# $this->request('GET', '/');\n# $this->assertTraceNotContains('store');\n\
# $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
\ function testDoesNotCacheResponsesWithoutFreshnessInformationOrAValidator()\n\
# {\n# $this->setNextResponse();\n# \n# $this->request('GET', '/');\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertTraceNotContains('store');\n\
# }\n# \n# public function testCachesResponsesWithExplicitNoCacheDirective()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
\ ['Expires' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 'public, no-cache']);\n\
# \n# $this->request('GET', '/');\n# $this->assertTraceContains('store');\n# $this->assertTrue($this->response->headers->has('Age'));\n\
# }\n# \n# public function testRevalidatesResponsesWithNoCacheDirectiveEvenIfFresh()\n\
# {\n# $this->setNextResponse(200, ['Cache-Control' => 'public, no-cache, max-age=10',\
\ 'ETag' => 'some-etag'], 'OK');\n# $this->request('GET', '/'); // warm the cache\n\
# \n# sleep(5);\n# \n# $this->setNextResponse(304, ['Cache-Control' => 'public,\
\ no-cache, max-age=10', 'ETag' => 'some-etag']);\n# $this->request('GET', '/');\n\
# \n# $this->assertHttpKernelIsCalled(); // no-cache -> MUST have revalidated\
\ at origin\n# $this->assertTraceContains('valid');\n# $this->assertEquals('OK',\
\ $this->response->getContent());\n# $this->assertEquals(0, $this->response->getAge());\n\
# }\n# \n# public function testCachesResponsesWithAnExpirationHeader()\n# {\n\
# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public', 'Expires' => $time->format(\\DATE_RFC2822)]);\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# \n# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
# }\n# \n# public function testCachesResponsesWithAMaxAgeDirective()\n# {\n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public, max-age=5']);\n# \n# $this->request('GET', '/');\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# \n# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
# }\n# \n# public function testCachesResponsesWithASMaxAgeDirective()\n# {\n#\
\ $this->setNextResponse(200, ['Cache-Control' => 's-maxage=5']);\n# \n# $this->request('GET',\
\ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# \n# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
# }\n# \n# public function testCachesResponsesWithALastModifiedValidatorButNoFreshnessInformation()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public', 'Last-Modified' => $time->format(\\DATE_RFC2822)]);\n\
# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# }\n# \n# public function testCachesResponsesWithAnETagValidatorButNoFreshnessInformation()\n\
# {\n# $this->setNextResponse(200, ['Cache-Control' => 'public', 'ETag' => '\"\
123456\"']);\n# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# }\n# \n# public function testHitsCachedResponsesWithExpiresHeader()\n\
# {\n# $time1 = \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $time2\
\ = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public', 'Date' => $time1->format(\\DATE_RFC2822), 'Expires'\
\ => $time2->format(\\DATE_RFC2822)]);\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertLessThan(2, strtotime($this->responses[0]->headers->get('Date'))\
\ - strtotime($this->response->headers->get('Date')));\n# $this->assertGreaterThan(0,\
\ $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
# $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
# public function testHitsCachedResponseWithMaxAgeDirective()\n# {\n# $time =\
\ \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $this->setNextResponse(200,\
\ ['Date' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 'public, max-age=10']);\n\
# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertLessThan(2, strtotime($this->responses[0]->headers->get('Date'))\
\ - strtotime($this->response->headers->get('Date')));\n# $this->assertGreaterThan(0,\
\ $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
# $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
# public function testDegradationWhenCacheLocked()\n# {\n# if ('\\\\' === \\DIRECTORY_SEPARATOR)\
\ {\n# $this->markTestSkipped('Skips on windows to avoid permissions issues.');\n\
# }\n# \n# $this->cacheConfig['stale_while_revalidate'] = 10;\n# \n# // The presence\
\ of Last-Modified makes this cacheable (because Response::isValidateable() then).\n\
# $this->setNextResponse(200, ['Cache-Control' => 'public, s-maxage=5', 'Last-Modified'\
\ => 'some while ago'], 'Old response');\n# $this->request('GET', '/'); // warm\
\ the cache\n# \n# // Now, lock the cache\n# $concurrentRequest = Request::create('/',\
\ 'GET');\n# $this->store->lock($concurrentRequest);\n# \n# /*\n# * After 10s,\
\ the cached response has become stale. Yet, we're still within the \"stale_while_revalidate\"\
\n# * timeout so we may serve the stale response.\n# */\n# sleep(10);\n# \n#\
\ $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertTraceContains('stale-while-revalidate');\n\
# $this->assertEquals('Old response', $this->response->getContent());\n# \n# /*\n\
# * Another 10s later, stale_while_revalidate is over. Resort to serving the old\
\ response, but\n# * do so with a \"server unavailable\" message.\n# */\n# sleep(10);\n\
# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
\ $this->assertEquals(503, $this->response->getStatusCode());\n# $this->assertEquals('Old\
\ response', $this->response->getContent());\n# }\n# \n# public function testHitsCachedResponseWithSMaxAgeDirective()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $this->setNextResponse(200,\
\ ['Date' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 's-maxage=10, max-age=0']);\n\
# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertLessThan(2, strtotime($this->responses[0]->headers->get('Date'))\
\ - strtotime($this->response->headers->get('Date')));\n# $this->assertGreaterThan(0,\
\ $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
# $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
# public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformation()\n\
# {\n# $this->setNextResponse();\n# \n# $this->cacheConfig['default_ttl'] = 10;\n\
# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# $this->assertMatchesRegularExpression('/s-maxage=10/', $this->response->headers->get('Cache-Control'));\n\
# \n# $this->cacheConfig['default_ttl'] = 10;\n# $this->request('GET', '/');\n\
# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=10/',\
\ $this->response->headers->get('Cache-Control'));\n# }\n# \n# public function\
\ testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAfterTtlWasExpired()\n\
# {\n# $this->setNextResponse();\n# \n# $this->cacheConfig['default_ttl'] = 2;\n\
# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/', $this->response->headers->get('Cache-Control'));\n\
# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
\ $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
# $this->assertTraceNotContains('store');\n# $this->assertEquals('Hello World',\
\ $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
\ $this->response->headers->get('Cache-Control'));\n# \n# // expires the cache\n\
# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
# $tmp = unserialize($values[0]);\n# $time = \\DateTimeImmutable::createFromFormat('U',\
\ time() - 5);\n# $tmp[0][1]['date'] = $time->format(\\DATE_RFC2822);\n# $r =\
\ new \\ReflectionObject($this->store);\n# $m = $r->getMethod('save');\n# $m->invoke($this->store,\
\ 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('stale');\n# $this->assertTraceContains('invalid');\n\
# $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/', $this->response->headers->get('Cache-Control'));\n\
# \n# $this->setNextResponse();\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
# $this->assertTraceNotContains('store');\n# $this->assertEquals('Hello World',\
\ $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
\ $this->response->headers->get('Cache-Control'));\n# }\n# \n# public function\
\ testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAfterTtlWasExpiredWithStatus304()\n\
# {\n# $this->setNextResponse();\n# \n# $this->cacheConfig['default_ttl'] = 2;\n\
# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/', $this->response->headers->get('Cache-Control'));\n\
# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
\ $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
# $this->assertTraceNotContains('store');\n# $this->assertEquals('Hello World',\
\ $this->response->getContent());\n# \n# // expires the cache\n# $values = $this->getMetaStorageValues();\n\
# $this->assertCount(1, $values);\n# $tmp = unserialize($values[0]);\n# $time\
\ = \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $tmp[0][1]['date']\
\ = $time->format(\\DATE_RFC2822);\n# $r = new \\ReflectionObject($this->store);\n\
# $m = $r->getMethod('save');\n# $m->invoke($this->store, 'md'.hash('sha256',\
\ 'http://localhost/'), serialize($tmp));\n# \n# $this->request('GET', '/');\n\
# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('stale');\n# $this->assertTraceContains('valid');\n\
# $this->assertTraceContains('store');\n# $this->assertTraceNotContains('miss');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
\ $this->response->headers->get('Cache-Control'));\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
\ $this->response->headers->get('Cache-Control'));\n# }\n# \n# public function\
\ testDoesNotAssignDefaultTtlWhenResponseHasMustRevalidateDirective()\n# {\n#\
\ $this->setNextResponse(200, ['Cache-Control' => 'must-revalidate']);\n# \n#\
\ $this->cacheConfig['default_ttl'] = 10;\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceNotContains('store');\n# $this->assertDoesNotMatchRegularExpression('/s-maxage/',\
\ $this->response->headers->get('Cache-Control'));\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# }\n# \n# public function testFetchesFullResponseWhenCacheStaleAndNoValidatorsPresent()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
\ ['Cache-Control' => 'public', 'Expires' => $time->format(\\DATE_RFC2822)]);\n\
# \n# // build initial request\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertNotNull($this->response->headers->get('Age'));\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
# \n# // go in and play around with the cached metadata directly ...\n# $values\
\ = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n# $tmp\
\ = unserialize($values[0]);\n# $time = \\DateTimeImmutable::createFromFormat('U',\
\ time());\n# $tmp[0][1]['expires'] = $time->format(\\DATE_RFC2822);\n# $r = new\
\ \\ReflectionObject($this->store);\n# $m = $r->getMethod('save');\n# $m->invoke($this->store,\
\ 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));\n# \n# // build\
\ subsequent request; should be found but miss due to freshness\n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertLessThanOrEqual(1, $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
# $this->assertTraceContains('stale');\n# $this->assertTraceNotContains('fresh');\n\
# $this->assertTraceNotContains('miss');\n# $this->assertTraceContains('store');\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
# public function testValidatesCachedResponsesWithLastModifiedAndNoFreshnessInformation()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# $this->setNextResponse(200,\
\ [], 'Hello World', function ($request, $response) use ($time) {\n# $response->headers->set('Cache-Control',\
\ 'public');\n# $response->headers->set('Last-Modified', $time->format(\\DATE_RFC2822));\n\
# if ($time->format(\\DATE_RFC2822) == $request->headers->get('IF_MODIFIED_SINCE'))\
\ {\n# $response->setStatusCode(304);\n# $response->setContent('');\n# }\n# });\n\
# \n# // build initial request\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Last-Modified'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertTraceNotContains('stale');\n\
# \n# // build subsequent request; should be found but miss due to freshness\n\
# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Last-Modified'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertLessThanOrEqual(1, $this->response->headers->get('Age'));\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
# $this->assertTraceContains('valid');\n# $this->assertTraceContains('store');\n\
# $this->assertTraceNotContains('miss');\n# }\n# \n# public function testValidatesCachedResponsesUseSameHttpMethod()\n\
# {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
\ {\n# $this->assertSame('OPTIONS', $request->getMethod());\n# });\n# \n# // build\
\ initial request\n# $this->request('OPTIONS', '/');\n# \n# // build subsequent\
\ request\n# $this->request('OPTIONS', '/');\n# }\n# \n# public function testValidatesCachedResponsesWithETagAndNoFreshnessInformation()\n\
# {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
\ {\n# $this->assertFalse($request->headers->has('If-Modified-Since'));\n# $response->headers->set('Cache-Control',\
\ 'public');\n# $response->headers->set('ETag', '\"12345\"');\n# if ($response->getETag()\
\ == $request->headers->get('IF_NONE_MATCH')) {\n# $response->setStatusCode(304);\n\
# $response->setContent('');\n# }\n# });\n# \n# // build initial request\n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertNotNull($this->response->headers->get('ETag'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# \n# // build subsequent request; should\
\ be found but miss due to freshness\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('ETag'));\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ $this->assertLessThanOrEqual(1, $this->response->headers->get('Age'));\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
# $this->assertTraceContains('valid');\n# $this->assertTraceContains('store');\n\
# $this->assertTraceNotContains('miss');\n# }\n# \n# public function testServesResponseWhileFreshAndRevalidatesWithLastModifiedInformation()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# \n# $this->setNextResponse(200,\
\ [], 'Hello World', function (Request $request, Response $response) use ($time)\
\ {\n# $response->setSharedMaxAge(10);\n# $response->headers->set('Last-Modified',\
\ $time->format(\\DATE_RFC2822));\n# });\n# \n# // prime the cache\n# $this->request('GET',\
\ '/');\n# \n# // next request before s-maxage has expired: Serve from cache\n\
# // without hitting the backend\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
# \n# sleep(15); // expire the cache\n# \n# $this->setNextResponse(304, [], '',\
\ function (Request $request, Response $response) use ($time) {\n# $this->assertEquals($time->format(\\\
DATE_RFC2822), $request->headers->get('IF_MODIFIED_SINCE'));\n# });\n# \n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
# $this->assertTraceContains('valid');\n# }\n# \n# public function testReplacesCachedResponsesWhenValidationResultsInNon304Response()\n\
# {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# $count =\
\ 0;\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
\ use ($time, &$count) {\n# $response->headers->set('Last-Modified', $time->format(\\\
DATE_RFC2822));\n# $response->headers->set('Cache-Control', 'public');\n# switch\
\ (++$count) {\n# case 1:\n# $response->setContent('first response');\n# break;\n\
# case 2:\n# $response->setContent('second response');\n# break;\n# case 3:\n\
# $response->setContent('');\n# $response->setStatusCode(304);\n# break;\n# }\n\
# });\n# \n# // first request should fetch from backend and store in cache\n#\
\ $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('first response', $this->response->getContent());\n# \n\
# // second request is validated, is invalid, and replaces cached entry\n# $this->request('GET',\
\ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('second\
\ response', $this->response->getContent());\n# \n# // third response is validated,\
\ valid, and returns cached entry\n# $this->request('GET', '/');\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertEquals('second response',\
\ $this->response->getContent());\n# \n# $this->assertEquals(3, $count);\n# }\n\
# \n# public function testPassesHeadRequestsThroughDirectlyOnPass()\n# {\n# $this->setNextResponse(200,\
\ [], 'Hello World', function ($request, $response) {\n# $response->setContent('');\n\
# $response->setStatusCode(200);\n# $this->assertEquals('HEAD', $request->getMethod());\n\
# });\n# \n# $this->request('HEAD', '/', ['HTTP_EXPECT' => 'something ...']);\n\
# $this->assertHttpKernelIsCalled();\n# $this->assertEquals('', $this->response->getContent());\n\
# }\n# \n# public function testUsesCacheToRespondToHeadRequestsWhenFresh()\n#\
\ {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
\ {\n# $response->headers->set('Cache-Control', 'public, max-age=10');\n# $response->setContent('Hello\
\ World');\n# $response->setStatusCode(200);\n# $this->assertNotEquals('HEAD',\
\ $request->getMethod());\n# });\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('HEAD',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('', $this->response->getContent());\n# $this->assertEquals(\\\
strlen('Hello World'), $this->response->headers->get('Content-Length'));\n# }\n\
# \n# public function testSendsNoContentWhenFresh()\n# {\n# $time = \\DateTimeImmutable::createFromFormat('U',\
\ time());\n# $this->setNextResponse(200, [], 'Hello World', function ($request,\
\ $response) use ($time) {\n# $response->headers->set('Cache-Control', 'public,\
\ max-age=10');\n# $response->headers->set('Last-Modified', $time->format(\\DATE_RFC2822));\n\
# });\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
\ '/', ['HTTP_IF_MODIFIED_SINCE' => $time->format(\\DATE_RFC2822)]);\n# $this->assertHttpKernelIsNotCalled();\n\
# $this->assertEquals(304, $this->response->getStatusCode());\n# $this->assertEquals('',\
\ $this->response->getContent());\n# }\n# \n# public function testInvalidatesCachedResponsesOnPost()\n\
# {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
\ {\n# if ('GET' == $request->getMethod()) {\n# $response->setStatusCode(200);\n\
# $response->headers->set('Cache-Control', 'public, max-age=500');\n# $response->setContent('Hello\
\ World');\n# } elseif ('POST' == $request->getMethod()) {\n# $response->setStatusCode(303);\n\
# $response->headers->set('Location', '/');\n# $response->headers->remove('Cache-Control');\n\
# $response->setContent('');\n# }\n# });\n# \n# // build initial request to enter\
\ into the cache\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
\ World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# \n# // make sure it is valid\n# $this->request('GET',\
\ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
# \n# // now POST to same URL\n# $this->request('POST', '/helloworld');\n# $this->assertHttpKernelIsCalled();\n\
# $this->assertEquals('/', $this->response->headers->get('Location'));\n# $this->assertTraceContains('invalidate');\n\
# $this->assertTraceContains('pass');\n# $this->assertEquals('', $this->response->getContent());\n\
# \n# // now make sure it was actually invalidated\n# $this->request('GET', '/');\n\
# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
# $this->assertTraceContains('invalid');\n# $this->assertTraceContains('store');\n\
# }\n# \n# public function testServesFromCacheWhenHeadersMatch()\n# {\n# $count\
\ = 0;\n# $this->setNextResponse(200, ['Cache-Control' => 'max-age=10000'], '',\
\ function ($request, $response) use (&$count) {\n# $response->headers->set('Vary',\
\ 'Accept User-Agent Foo');\n# $response->headers->set('Cache-Control', 'public,\
\ max-age=10');\n# $response->headers->set('X-Response-Count', ++$count);\n# $response->setContent($request->headers->get('USER_AGENT'));\n\
# });\n# \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
\ => 'Bob/1.0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Bob/1.0', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# \n# $this->request('GET', '/', ['HTTP_ACCEPT'\
\ => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0']);\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertEquals('Bob/1.0', $this->response->getContent());\n\
# $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
\ }\n# \n# public function testStoresMultipleResponsesWhenHeadersDiffer()\n# {\n\
# $count = 0;\n# $this->setNextResponse(200, ['Cache-Control' => 'max-age=10000'],\
\ '', function ($request, $response) use (&$count) {\n# $response->headers->set('Vary',\
\ 'Accept User-Agent Foo');\n# $response->headers->set('Cache-Control', 'public,\
\ max-age=10');\n# $response->headers->set('X-Response-Count', ++$count);\n# $response->setContent($request->headers->get('USER_AGENT'));\n\
# });\n# \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
\ => 'Bob/1.0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
# $this->assertEquals('Bob/1.0', $this->response->getContent());\n# $this->assertEquals(1,\
\ $this->response->headers->get('X-Response-Count'));\n# \n# $this->request('GET',\
\ '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/2.0']);\n# $this->assertEquals(200,\
\ $this->response->getStatusCode());\n# $this->assertTraceContains('miss');\n\
# $this->assertTraceContains('store');\n# $this->assertEquals('Bob/2.0', $this->response->getContent());\n\
# $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));\n\
# \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
\ => 'Bob/1.0']);\n# $this->assertTraceContains('fresh');\n# $this->assertEquals('Bob/1.0',\
\ $this->response->getContent());\n# $this->assertEquals(1, $this->response->headers->get('X-Response-Count'));\n\
# \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
\ => 'Bob/2.0']);\n# $this->assertTraceContains('fresh');\n# $this->assertEquals('Bob/2.0',\
\ $this->response->getContent());\n# $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));\n\
# \n# $this->request('GET', '/', ['HTTP_USER_AGENT' => 'Bob/2.0']);\n# $this->assertTraceContains('miss');\n\
# $this->assertEquals('Bob/2.0', $this->response->getContent());\n# $this->assertEquals(3,\
\ $this->response->headers->get('X-Response-Count'));\n# }\n# \n# public function\
\ testShouldCatchExceptions()\n# {\n# $this->catchExceptions();\n# \n# $this->setNextResponse();\n\
# $this->request('GET', '/');\n# \n# $this->assertExceptionsAreCaught();\n# }\n\
# \n# public function testShouldCatchExceptionsWhenReloadingAndNoCacheRequest()\n\
# {\n# $this->catchExceptions();\n# \n# $this->setNextResponse();\n# $this->cacheConfig['allow_reload']\
\ = true;\n# $this->request('GET', '/', [], [], false, ['Pragma' => 'no-cache']);\n\
# \n# $this->assertExceptionsAreCaught();\n# }\n# \n# public function testShouldNotCatchExceptions()\n\
# {\n# $this->catchExceptions(false);\n# \n# $this->setNextResponse();\n# $this->request('GET',\
\ '/');\n# \n# $this->assertExceptionsAreNotCaught();\n# }\n# \n# public function\
\ testEsiCacheSendsTheLowestTtl()\n# {\n# $responses = [\n# [\n# 'status' => 200,\n\
# 'body' => ' ',\n# 'headers'\
\ => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control' => 'content=\"\
ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' => 'Hello World!',\n\
# 'headers' => ['Cache-Control' => 's-maxage=200'],\n# ],\n# [\n# 'status' =>\
\ 200,\n# 'body' => 'My name is Bobby.',\n# 'headers' => ['Cache-Control' => 's-maxage=100'],\n\
# ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n# $this->request('GET',\
\ '/', [], [], true);\n# $this->assertEquals('Hello World! My name is Bobby.',\
\ $this->response->getContent());\n# \n# $this->assertEquals(100, $this->response->getTtl());\n\
# }\n# \n# public function testEsiCacheSendsTheLowestTtlForHeadRequests()\n# {\n\
# $responses = [\n# [\n# 'status' => 200,\n# 'body' => 'I am a long-lived main\
\ response, but I embed a short-lived resource: ',\n\
# 'headers' => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control'\
\ => 'content=\"ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' =>\
\ 'I am a short-lived resource',\n# 'headers' => ['Cache-Control' => 's-maxage=100'],\n\
# ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n# $this->request('HEAD',\
\ '/', [], [], true);\n# \n# $this->assertEmpty($this->response->getContent());\n\
# $this->assertEquals(100, $this->response->getTtl());\n# }\n# \n# public function\
\ testEsiCacheForceValidation()\n# {\n# $responses = [\n# [\n# 'status' => 200,\n\
# 'body' => ' ',\n# 'headers'\
\ => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control' => 'content=\"\
ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' => 'Hello World!',\n\
# 'headers' => ['ETag' => 'foobar'],\n# ],\n# [\n# 'status' => 200,\n# 'body'\
\ => 'My name is Bobby.',\n# 'headers' => ['Cache-Control' => 's-maxage=100'],\n\
# ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n# $this->request('GET',\
\ '/', [], [], true);\n# $this->assertEquals('Hello World! My name is Bobby.',\
\ $this->response->getContent());\n# $this->assertNull($this->response->getTtl());\n\
# $this->assertTrue($this->response->headers->hasCacheControlDirective('private'));\n\
# $this->assertTrue($this->response->headers->hasCacheControlDirective('no-cache'));\n\
# }\n# \n# public function testEsiCacheForceValidationForHeadRequests()\n# {\n\
# $responses = [\n# [\n# 'status' => 200,\n# 'body' => 'I am the main response\
\ and use expiration caching, but I embed another resource: ',\n# 'headers' => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control'\
\ => 'content=\"ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' =>\
\ 'I am the embedded resource and use validation caching',\n# 'headers' => ['ETag'\
\ => 'foobar'],\n# ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n\
# $this->request('HEAD', '/', [], [], true);\n# \n# // The response has been assembled\
\ from expiration and validation based resources\n# // This can neither be cached\
\ nor revalidated, so it should be private/no cache\n# $this->assertEmpty($this->response->getContent());\n\
# $this->assertNull($this->response->getTtl());\n# $this->assertTrue($this->response->headers->hasCacheControlDirective('private'));\n\
# $this->assertTrue($this->response->headers->hasCacheControlDirective('no-cache'));\n\
# }\n# \n# public function testEsiRecalculateContentLengthHeader()\n# {\n# $responses\
\ = [\n# [\n# 'status' => 200,\n# 'body' => '',\n\
# 'headers' => [\n# 'Content-Length' => 26,\n# 'Surrogate-Control' => 'content=\"\
ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' => 'Hello World!',\n\
# 'headers' => [],\n# ],\n# ];\n# \n# $this->setNextResponses($responses);\n#\
\ \n# $this->request('GET', '/', [], [], true);\n# $this->assertEquals('Hello\
\ World!', $this->response->getContent());\n# $this->assertEquals(12, $this->response->headers->get('Content-Length'));\n\
# }\n# \n# public function testEsiRecalculateContentLengthHeaderForHeadRequest()\n\
# {\n# $responses = [\n# [\n# 'status' => 200,\n# 'body' => '',\n# 'headers' => [\n# 'Content-Length' => 26,\n# 'Surrogate-Control'\
\ => 'content=\"ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' =>\
\ 'Hello World!',\n# 'headers' => [],\n# ],\n# ];\n# \n# $this->setNextResponses($responses);\n\
# \n# $this->request('HEAD', '/', [], [], true);\n# \n# // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13\n\
# // \"The Content-Length entity-header field indicates the size of the entity-body,\n\
# // in decimal number of OCTETs, sent to the recipient or, in the case of the\
\ HEAD\n# // method, the size of the entity-body that would have been sent had\
\ the request\n# // been a GET.\"\n# $this->assertEmpty($this->response->getContent());\n\
# $this->assertEquals(12, $this->response->headers->get('Content-Length'));\n\
# }\n# \n# public function testClientIpIsAlwaysLocalhostForForwardedRequests()\n\
# {\n# $this->setNextResponse();\n# $this->request('GET', '/', ['REMOTE_ADDR'\
\ => '10.0.0.1']);\n# \n# $this->kernel->assert(function ($backendRequest) {\n\
# $this->assertSame('127.0.0.1', $backendRequest->server->get('REMOTE_ADDR'));\n\
# });\n# }\n# \n# /**\n# * @dataProvider getTrustedProxyData"
- name: getTrustedProxyData
visibility: public
parameters: []
comment: null
- name: testForwarderHeaderForForwardedRequests
visibility: public
parameters:
- name: forwarded
- name: expected
comment: '# * @dataProvider getForwardedData'
- name: getForwardedData
visibility: public
parameters: []
comment: null
- name: testEsiCacheRemoveValidationHeadersIfEmbeddedResponses
visibility: public
parameters: []
comment: null
- name: testEsiCacheRemoveValidationHeadersIfEmbeddedResponsesAndHeadRequest
visibility: public
parameters: []
comment: null
- name: testDoesNotCacheOptionsRequest
visibility: public
parameters: []
comment: null
- name: testUsesOriginalRequestForSurrogate
visibility: public
parameters: []
comment: null
- name: testStaleIfErrorMustNotResetLifetime
visibility: public
parameters: []
comment: null
- name: testResponsesThatMayBeUsedStaleIfError
visibility: public
parameters:
- name: responseHeaders
- name: sleepBetweenRequests
default: 'null'
comment: '# * @dataProvider getResponseDataThatMayBeServedStaleIfError'
- name: getResponseDataThatMayBeServedStaleIfError
visibility: public
parameters: []
comment: null
- name: testResponsesThatMustNotBeUsedStaleIfError
visibility: public
parameters:
- name: responseHeaders
- name: sleepBetweenRequests
default: 'null'
comment: '# * @dataProvider getResponseDataThatMustNotBeServedStaleIfError'
- name: testSkipsConfiguredResponseHeadersForStore
visibility: public
parameters: []
comment: null
- name: getResponseDataThatMustNotBeServedStaleIfError
visibility: public
parameters: []
comment: null
- name: testStaleIfErrorWhenStrictSmaxageDisabled
visibility: public
parameters: []
comment: null
- name: testTraceHeaderNameCanBeChanged
visibility: public
parameters: []
comment: null
- name: testTraceLevelDefaultsToFullIfDebug
visibility: public
parameters: []
comment: null
- name: testTraceLevelDefaultsToNoneIfNotDebug
visibility: public
parameters: []
comment: null
- name: testTraceLevelShort
visibility: public
parameters: []
comment: null
- name: terminate
visibility: public
parameters:
- name: request
- name: response
comment: null
- name: handle
visibility: public
parameters:
- name: request
- name: type
default: self::MAIN_REQUEST
- name: catch
default: 'true'
comment: null
traits:
- Symfony\Component\EventDispatcher\EventDispatcher
- Symfony\Component\HttpFoundation\Request
- Symfony\Component\HttpFoundation\Response
- Symfony\Component\HttpKernel\Event\TerminateEvent
- Symfony\Component\HttpKernel\HttpCache\Esi
- Symfony\Component\HttpKernel\HttpCache\HttpCache
- Symfony\Component\HttpKernel\HttpCache\StoreInterface
- Symfony\Component\HttpKernel\HttpKernelInterface
- Symfony\Component\HttpKernel\Kernel
interfaces:
- TerminableInterface
- HttpKernelInterface