@@ -348,6 +348,127 @@ public function testLoadsBodyEval()
348348 $ this ->assertSame ($ content , $ response ->getContent ());
349349 }
350350
351+ /**
352+ * Basic case when the second header has a different value.
353+ * Both responses should be cached
354+ */
355+ public function testWriteWithMultipleVaryAndCachedAllResponse ()
356+ {
357+ $ req1 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_BAR ' => 'bar ' ]);
358+ $ content = str_repeat ('a ' , 24 ).'b ' .str_repeat ('a ' , 24 );
359+ $ res1 = new Response ($ content , 200 , ['vary ' => ['Foo ' , 'Bar ' ], 'X-Body-Eval ' => 'SSI ' ]);
360+ $ this ->store ->write ($ req1 , $ res1 );
361+
362+ $ responseLook = $ this ->store ->lookup ($ req1 );
363+ $ this ->assertSame ($ content , $ responseLook ->getContent ());
364+
365+ $ req2 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_BAR ' => 'foobar ' ]);
366+ $ content2 = str_repeat ('b ' , 24 ).'a ' .str_repeat ('b ' , 24 );
367+ $ res2 = new Response ($ content2 , 200 , ['vary ' => ['Foo ' , 'Bar ' ], 'X-Body-Eval ' => 'SSI ' ]);
368+ $ this ->store ->write ($ req2 , $ res2 );
369+
370+ $ responseLook = $ this ->store ->lookup ($ req2 );
371+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
372+
373+ $ responseLook = $ this ->store ->lookup ($ req1 );
374+ $ this ->assertSame ($ content , $ responseLook ->getContent ());
375+ }
376+
377+ /**
378+ * Basic case when the second header has the same value on both requests.
379+ * The last response should be cached
380+ */
381+ public function testWriteWithMultipleVaryAndCachedLastResponse ()
382+ {
383+ $ req1 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_BAR ' => 'bar ' ]);
384+ $ content = str_repeat ('a ' , 24 ).'b ' .str_repeat ('a ' , 24 );
385+ $ res1 = new Response ($ content , 200 , ['vary ' => ['Foo ' , 'Bar ' ], 'X-Body-Eval ' => 'SSI ' ]);
386+ $ this ->store ->write ($ req1 , $ res1 );
387+
388+ $ responseLook = $ this ->store ->lookup ($ req1 );
389+ $ this ->assertSame ($ content , $ responseLook ->getContent ());
390+
391+ $ req2 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_BAR ' => 'bar ' ]);
392+ $ content2 = str_repeat ('b ' , 24 ).'a ' .str_repeat ('b ' , 24 );
393+ $ res2 = new Response ($ content2 , 200 , ['vary ' => ['Foo ' , 'Bar ' ], 'X-Body-Eval ' => 'SSI ' ]);
394+ $ this ->store ->write ($ req2 , $ res2 );
395+
396+ $ responseLook = $ this ->store ->lookup ($ req2 );
397+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
398+
399+ $ responseLook = $ this ->store ->lookup ($ req1 );
400+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
401+ }
402+
403+ /**
404+ * Case when a vary value has been removed.
405+ * Both responses should be cached
406+ */
407+ public function testWriteWithChangingVary ()
408+ {
409+ $ req1 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_BAR ' => 'bar ' ]);
410+ $ content = str_repeat ('a ' , 24 ).'b ' .str_repeat ('a ' , 24 );
411+ $ res1 = new Response ($ content , 200 , ['vary ' => ['Foo ' , 'bar ' , 'foobar ' ], 'X-Body-Eval ' => 'SSI ' ]);
412+ $ this ->store ->write ($ req1 , $ res1 );
413+
414+ $ req2 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_FOOBAR ' => 'bar ' ]);
415+ $ content2 = str_repeat ('b ' , 24 ).'a ' .str_repeat ('b ' , 24 );
416+ $ res2 = new Response ($ content2 , 200 , ['vary ' => ['Foo ' , 'foobar ' ], 'X-Body-Eval ' => 'SSI ' ]);
417+ $ this ->store ->write ($ req2 , $ res2 );
418+
419+ $ responseLook = $ this ->store ->lookup ($ req2 );
420+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
421+
422+ $ responseLook = $ this ->store ->lookup ($ req1 );
423+ $ this ->assertSame ($ content , $ responseLook ->getContent ());
424+ }
425+
426+ /**
427+ * Case when a vary value has been removed and headers of the new vary list are the same.
428+ * The last response should be cached
429+ */
430+ public function testWriteWithRemoveVaryAndAllHeadersOnTheList ()
431+ {
432+ $ req1 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_FOOBAR ' => 'bar ' ,]);
433+ $ content = str_repeat ('a ' , 24 ).'b ' .str_repeat ('a ' , 24 );
434+ $ res1 = new Response ($ content , 200 , ['vary ' => ['Foo ' , 'bar ' , 'foobar ' ], 'X-Body-Eval ' => 'SSI ' ]);
435+ $ this ->store ->write ($ req1 , $ res1 );
436+
437+ $ req2 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_FOOBAR ' => 'bar ' ]);
438+ $ content2 = str_repeat ('b ' , 24 ).'a ' .str_repeat ('b ' , 24 );
439+ $ res2 = new Response ($ content2 , 200 , ['vary ' => ['Foo ' , 'foobar ' ], 'X-Body-Eval ' => 'SSI ' ]);
440+ $ this ->store ->write ($ req2 , $ res2 );
441+
442+ $ responseLook = $ this ->store ->lookup ($ req2 );
443+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
444+
445+ $ responseLook = $ this ->store ->lookup ($ req1 );
446+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
447+ }
448+
449+ /**
450+ * Case when a vary value has been added and headers of the new vary list are the same.
451+ * The last response should be cached
452+ */
453+ public function testWriteWithAddingVaryAndAllHeadersOnTheList ()
454+ {
455+ $ req1 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_FOOBAR ' => 'bar ' ]);
456+ $ content = str_repeat ('a ' , 24 ).'b ' .str_repeat ('a ' , 24 );
457+ $ res1 = new Response ($ content , 200 , ['vary ' => ['Foo ' , 'foobar ' ], 'X-Body-Eval ' => 'SSI ' ]);
458+ $ this ->store ->write ($ req1 , $ res1 );
459+
460+ $ req2 = Request::create ('/foo ' , 'get ' , [], [], [], ['HTTP_FOO ' => 'foo ' , 'HTTP_BAR ' => 'foobar ' , 'HTTP_FOOBAR ' => 'bar ' ]);
461+ $ content2 = str_repeat ('b ' , 24 ).'a ' .str_repeat ('b ' , 24 );
462+ $ res2 = new Response ($ content2 , 200 , ['vary ' => ['Foo ' , 'bar ' , 'foobar ' ], 'X-Body-Eval ' => 'SSI ' ]);
463+ $ this ->store ->write ($ req2 , $ res2 );
464+
465+ $ responseLook = $ this ->store ->lookup ($ req2 );
466+ $ this ->assertSame ($ content2 , $ responseLook ->getContent ());
467+
468+ $ responseLook = $ this ->store ->lookup ($ req1 );
469+ $ this ->assertSame ($ content , $ responseLook ->getContent ());
470+ }
471+
351472 protected function storeSimpleEntry ($ path = null , $ headers = [])
352473 {
353474 $ path ??= '/test ' ;
0 commit comments