@@ -121,7 +121,7 @@ public function matchesTo(MediaTypeInterface $mediaType): bool
121
121
return
122
122
$ this ->isTypeMatches ($ mediaType ) &&
123
123
$ this ->isSubTypeMatches ($ mediaType ) &&
124
- $ this ->isMediaParametersEqual ($ mediaType );
124
+ $ this ->isMediaParametersMatch ($ mediaType );
125
125
}
126
126
127
127
/**
@@ -179,6 +179,42 @@ private function isSubTypeEquals(MediaTypeInterface $mediaType): bool
179
179
return strcasecmp ($ this ->getSubType (), $ mediaType ->getSubType ()) === 0 ;
180
180
}
181
181
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
+
182
218
/**
183
219
* @param MediaTypeInterface $mediaType
184
220
*
@@ -262,4 +298,18 @@ private function paramValuesEqual(string $name, string $value, string $valueToCo
262
298
263
299
return $ valuesEqual ;
264
300
}
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
+ }
265
315
}
0 commit comments