@@ -121,7 +121,7 @@ public function matchesTo(MediaTypeInterface $mediaType): bool
121121 return
122122 $ this ->isTypeMatches ($ mediaType ) &&
123123 $ this ->isSubTypeMatches ($ mediaType ) &&
124- $ this ->isMediaParametersEqual ($ mediaType );
124+ $ this ->isMediaParametersMatch ($ mediaType );
125125 }
126126
127127 /**
@@ -179,6 +179,42 @@ private function isSubTypeEquals(MediaTypeInterface $mediaType): bool
179179 return strcasecmp ($ this ->getSubType (), $ mediaType ->getSubType ()) === 0 ;
180180 }
181181
182+ /**
183+ * @param MediaTypeInterface $mediaType
184+ *
185+ * @return bool
186+ */
187+ private function isMediaParametersMatch (MediaTypeInterface $ mediaType ): bool
188+ {
189+ if ($ this ->bothMediaTypeParamsEmpty ($ mediaType ) === true ) {
190+ return true ;
191+ } elseif ($ this ->bothMediaTypeParamsNotEmptyAndEqualInSize ($ mediaType )) {
192+ // Type, subtype and param name should be compared case-insensitive
193+ // https://tools.ietf.org/html/rfc7231#section-3.1.1.1
194+ $ ourParameters = array_change_key_case ($ this ->getParameters ());
195+ $ parametersToCompare = array_change_key_case ($ mediaType ->getParameters ());
196+
197+ // if at least one name are different they are not equal
198+ if (empty (array_diff_key ($ ourParameters , $ parametersToCompare )) === false ) {
199+ return false ;
200+ }
201+
202+ // If we are here we have to compare values. Also some of the values should be compared case-insensitive
203+ // according to https://tools.ietf.org/html/rfc7231#section-3.1.1.1
204+ // > 'Parameter values might or might not be case-sensitive, depending on
205+ // the semantics of the parameter name.'
206+ foreach ($ ourParameters as $ name => $ value ) {
207+ if ($ this ->paramValuesMatch ($ name , $ value , $ parametersToCompare [$ name ]) === false ) {
208+ return false ;
209+ }
210+ }
211+
212+ return true ;
213+ }
214+
215+ return false ;
216+ }
217+
182218 /**
183219 * @param MediaTypeInterface $mediaType
184220 *
@@ -262,4 +298,18 @@ private function paramValuesEqual(string $name, string $value, string $valueToCo
262298
263299 return $ valuesEqual ;
264300 }
301+
302+ /**
303+ * @param string $name
304+ * @param string $value
305+ * @param string $valueToCompare
306+ *
307+ * @return bool
308+ */
309+ private function paramValuesMatch (string $ name , string $ value , string $ valueToCompare ): bool
310+ {
311+ $ valuesEqual = $ valueToCompare === '* ' || $ this ->paramValuesEqual ($ name , $ value , $ valueToCompare );
312+
313+ return $ valuesEqual ;
314+ }
265315}
0 commit comments