@@ -176,24 +176,25 @@ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQ
176176 }
177177 }
178178
179- $ path = $ request ->getPathInfo ();
180- if ($ qs = $ request ->getQueryString ()) {
181- $ path .= '? ' .$ qs ;
182- }
183- $ this ->traces [$ request ->getMethod ().' ' .$ path ] = array ();
179+ $ this ->traces [$ this ->getTraceKey ($ request )] = array ();
184180
185181 if (!$ request ->isMethodSafe (false )) {
186182 $ response = $ this ->invalidate ($ request , $ catch );
187183 } elseif ($ request ->headers ->has ('expect ' ) || !$ request ->isMethodCacheable ()) {
188184 $ response = $ this ->pass ($ request , $ catch );
185+ } elseif ($ this ->options ['allow_reload ' ] && $ request ->isNoCache ()) {
186+ /*
187+ If allow_reload is configured and the client requests "Cache-Control: no-cache",
188+ reload the cache by fetching a fresh response and caching it (if possible).
189+ */
190+ $ this ->record ($ request , 'reload ' );
191+ $ response = $ this ->fetch ($ request , $ catch );
189192 } else {
190193 $ response = $ this ->lookup ($ request , $ catch );
191194 }
192195
193196 $ this ->restoreResponseBody ($ request , $ response );
194197
195- $ response ->setDate (\DateTime::createFromFormat ('U ' , time (), new \DateTimeZone ('UTC ' )));
196-
197198 if (HttpKernelInterface::MASTER_REQUEST === $ type && $ this ->options ['debug ' ]) {
198199 $ response ->headers ->set ('X-Symfony-Cache ' , $ this ->getLog ());
199200 }
@@ -299,13 +300,6 @@ protected function invalidate(Request $request, $catch = false)
299300 */
300301 protected function lookup (Request $ request , $ catch = false )
301302 {
302- // if allow_reload and no-cache Cache-Control, allow a cache reload
303- if ($ this ->options ['allow_reload ' ] && $ request ->isNoCache ()) {
304- $ this ->record ($ request , 'reload ' );
305-
306- return $ this ->fetch ($ request , $ catch );
307- }
308-
309303 try {
310304 $ entry = $ this ->store ->lookup ($ request );
311305 } catch (\Exception $ e ) {
@@ -403,9 +397,8 @@ protected function validate(Request $request, Response $entry, $catch = false)
403397 }
404398
405399 /**
406- * Forwards the Request to the backend and determines whether the response should be stored.
407- *
408- * This methods is triggered when the cache missed or a reload is required.
400+ * Unconditionally fetches a fresh response from the backend and
401+ * stores it in the cache if is cacheable.
409402 *
410403 * @param Request $request A Request instance
411404 * @param bool $catch whether to process exceptions
@@ -437,6 +430,9 @@ protected function fetch(Request $request, $catch = false)
437430 /**
438431 * Forwards the Request to the backend and returns the Response.
439432 *
433+ * All backend requests (cache passes, fetches, cache validations)
434+ * run through this method.
435+ *
440436 * @param Request $request A Request instance
441437 * @param bool $catch Whether to catch exceptions or not
442438 * @param Response $entry A Response instance (the stale entry if present, null otherwise)
@@ -484,6 +480,17 @@ protected function forward(Request $request, $catch = false, Response $entry = n
484480 }
485481 }
486482
483+ /*
484+ RFC 7231 Sect. 7.1.1.2 says that a server that does not have a reasonably accurate
485+ clock MUST NOT send a "Date" header, although it MUST send one in most other cases
486+ except for 1xx or 5xx responses where it MAY do so.
487+
488+ Anyway, a client that received a message without a "Date" header MUST add it.
489+ */
490+ if (!$ response ->headers ->has ('Date ' )) {
491+ $ response ->setDate (\DateTime::createFromFormat ('U ' , time ()));
492+ }
493+
487494 $ this ->processResponseBody ($ request , $ response );
488495
489496 if ($ this ->isPrivateRequest ($ request ) && !$ response ->headers ->hasCacheControlDirective ('public ' )) {
@@ -584,9 +591,6 @@ protected function lock(Request $request, Response $entry)
584591 */
585592 protected function store (Request $ request , Response $ response )
586593 {
587- if (!$ response ->headers ->has ('Date ' )) {
588- $ response ->setDate (\DateTime::createFromFormat ('U ' , time ()));
589- }
590594 try {
591595 $ this ->store ->write ($ request , $ response );
592596
@@ -683,11 +687,24 @@ private function isPrivateRequest(Request $request)
683687 * @param string $event The event name
684688 */
685689 private function record (Request $ request , $ event )
690+ {
691+ $ this ->traces [$ this ->getTraceKey ($ request )][] = $ event ;
692+ }
693+
694+ /**
695+ * Calculates the key we use in the "trace" array for a given request.
696+ *
697+ * @param Request $request
698+ *
699+ * @return string
700+ */
701+ private function getTraceKey (Request $ request )
686702 {
687703 $ path = $ request ->getPathInfo ();
688704 if ($ qs = $ request ->getQueryString ()) {
689705 $ path .= '? ' .$ qs ;
690706 }
691- $ this ->traces [$ request ->getMethod ().' ' .$ path ][] = $ event ;
707+
708+ return $ request ->getMethod ().' ' .$ path ;
692709 }
693710}
0 commit comments