function testMimeTypeMatch() { $this->assertEquals('text/html', mimeTypeMatch('text/html', array('application/xhtml+xml' => 1.0, 'text/html' => 0.7, 'text/plain' => 0.3))); $this->assertEquals('text/*', mimeTypeMatch('text/html', array('image/*' => 1.0, 'text/*' => 0.5))); $this->assertEquals('*/*', mimeTypeMatch('text/html', array('*/*' => 1.0))); $this->assertNull(mimeTypeMatch('text/html', array('image/png' => 1.0, 'image/svg+xml' => 0.5))); }
/** * Returns the 'best' match between a client's requested internet media types * and the server's list of available types. Each list should be an associative * array of type to preference (preference is a float between 0.0 and 1.0). * Wildcards in the types are acceptable. * * @param array $cprefs Client's acceptable type list * @param array $sprefs Server's offered types * @return string * * @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8' * XXX: generalize to negotiate other stuff */ function wfNegotiateType($cprefs, $sprefs) { $combine = array(); foreach (array_keys($sprefs) as $type) { $parts = explode('/', $type); if ($parts[1] != '*') { $ckey = mimeTypeMatch($type, $cprefs); if ($ckey) { $combine[$type] = $sprefs[$type] * $cprefs[$ckey]; } } } foreach (array_keys($cprefs) as $type) { $parts = explode('/', $type); if ($parts[1] != '*' && !array_key_exists($type, $sprefs)) { $skey = mimeTypeMatch($type, $sprefs); if ($skey) { $combine[$type] = $sprefs[$skey] * $cprefs[$type]; } } } $bestq = 0; $besttype = null; foreach (array_keys($combine) as $type) { if ($combine[$type] > $bestq) { $besttype = $type; $bestq = $combine[$type]; } } return $besttype; }