1111
1212namespace FOS \HttpCache \SymfonyCache ;
1313
14+ use FOS \HttpCache \TagHeaderFormatter \CommaSeparatedTagHeaderFormatter ;
15+ use FOS \HttpCache \TagHeaderFormatter \TagHeaderParser ;
1416use Symfony \Component \HttpFoundation \Response ;
1517use Symfony \Component \OptionsResolver \OptionsResolver ;
1618use Toflar \Psr6HttpCacheStore \Psr6StoreInterface ;
@@ -42,6 +44,11 @@ class PurgeTagsListener extends AccessControlledListener
4244 */
4345 private $ tagsHeader ;
4446
47+ /**
48+ * @var TagHeaderParser
49+ */
50+ private $ tagsParser ;
51+
4552 /**
4653 * When creating the purge listener, you can configure an additional option.
4754 *
@@ -65,6 +72,7 @@ public function __construct(array $options = [])
6572
6673 $ this ->tagsMethod = $ options ['tags_method ' ];
6774 $ this ->tagsHeader = $ options ['tags_header ' ];
75+ $ this ->tagsParser = $ options ['tags_parser ' ];
6876 }
6977
7078 /**
@@ -125,11 +133,7 @@ public function handlePurgeTags(CacheEvent $event)
125133 $ headers = $ request ->headers ->get ($ this ->tagsHeader , '' , false );
126134 }
127135
128- foreach ($ headers as $ header ) {
129- foreach (explode (', ' , $ header ) as $ tag ) {
130- $ tags [] = $ tag ;
131- }
132- }
136+ $ tags = $ this ->tagsParser ->parseTagsHeaderValue ($ headers );
133137
134138 if ($ store ->invalidateTags ($ tags )) {
135139 $ response ->setStatusCode (200 , 'Purged ' );
@@ -151,9 +155,11 @@ protected function getOptionsResolver()
151155 $ resolver ->setDefaults ([
152156 'tags_method ' => static ::DEFAULT_TAGS_METHOD ,
153157 'tags_header ' => static ::DEFAULT_TAGS_HEADER ,
158+ 'tags_parser ' => new CommaSeparatedTagHeaderFormatter (),
154159 ]);
155160 $ resolver ->setAllowedTypes ('tags_method ' , 'string ' );
156161 $ resolver ->setAllowedTypes ('tags_header ' , 'string ' );
162+ $ resolver ->setAllowedTypes ('tags_parser ' , TagHeaderParser::class);
157163
158164 return $ resolver ;
159165 }
0 commit comments