diff --git a/.gitignore b/.gitignore index 7cae452b..a5a487f7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ /vendor-bin/**/vendor /.php_cs.cache /.phpunit-cache/ +/.phpunit.cache/ /.dump.rdb diff --git a/src/SurrogateKeys.php b/src/SurrogateKeys.php index 073120a2..f9ff9a42 100644 --- a/src/SurrogateKeys.php +++ b/src/SurrogateKeys.php @@ -38,14 +38,11 @@ public function addTag(ResourceObject $ro): void public function setSurrogateHeader(ResourceObject $ro): void { - $key = implode(' ', array_unique($this->surrogateKeys)); - $wasSetManually = isset($ro->headers[Header::SURROGATE_KEY]); - if ($wasSetManually) { - $ro->headers[Header::SURROGATE_KEY] .= ' ' . $key; - - return; + $keys = $this->surrogateKeys; + if (isset($ro->headers[Header::SURROGATE_KEY])) { + $keys = array_merge(explode(' ', $ro->headers[Header::SURROGATE_KEY]), $keys); } - $ro->headers[Header::SURROGATE_KEY] = $key; + $ro->headers[Header::SURROGATE_KEY] = implode(' ', array_unique($keys)); } } diff --git a/tests/SurrogateKeysTest.php b/tests/SurrogateKeysTest.php index 7206373d..3ca95bda 100644 --- a/tests/SurrogateKeysTest.php +++ b/tests/SurrogateKeysTest.php @@ -73,4 +73,23 @@ public function testOnePurgeKey(): void $etags->setSurrogateHeader($foo); $this->assertSame('_foo_', $foo->headers[Header::SURROGATE_KEY]); } + + public function testSetSurrogateHeaderDeduplicatesWithManualKeys(): void + { + $uri = new Uri('app://self/foo'); + $etags = new SurrogateKeys($uri); + $child = new class extends ResourceObject{ + /** @var array */ + public $headers = [Header::SURROGATE_KEY => 'shared-tag']; // phpcs:ignore + }; + $child->uri = new Uri('app://self/foo1'); + $etags->addTag($child); + $ro = new class extends ResourceObject{ + /** @var array */ + public $headers = [Header::SURROGATE_KEY => 'shared-tag _foo_']; // phpcs:ignore + }; + $ro->uri = $uri; + $etags->setSurrogateHeader($ro); + $this->assertSame('shared-tag _foo_ _foo1_', $ro->headers[Header::SURROGATE_KEY]); + } }