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