diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..e742c9b35 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +Tests/ export-ignore +phpunit.xml.dist export-ignore diff --git a/Request.php b/Request.php index 68623b51d..7ce29c3a7 100644 --- a/Request.php +++ b/Request.php @@ -1277,23 +1277,31 @@ public function splitHttpAcceptHeader($header) } $values = array(); + $groups = array(); foreach (array_filter(explode(',', $header)) as $value) { // Cut off any q-value that might come after a semi-colon if (preg_match('/;\s*(q=.*$)/', $value, $match)) { - $q = (float) substr(trim($match[1]), 2); + $q = substr(trim($match[1]), 2); $value = trim(substr($value, 0, -strlen($match[0]))); } else { $q = 1; } + $groups[$q][] = $value; + } + + krsort($groups); + + foreach ($groups as $q => $items) { + $q = (float) $q; + if (0 < $q) { - $values[trim($value)] = $q; + foreach ($items as $value) { + $values[trim($value)] = $q; + } } } - arsort($values); - reset($values); - return $values; } diff --git a/Tests/RequestTest.php b/Tests/RequestTest.php index 6cb35790b..0a03eeb65 100644 --- a/Tests/RequestTest.php +++ b/Tests/RequestTest.php @@ -913,7 +913,7 @@ public function testGetCharsets() $request = new Request(); $request->headers->set('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'); - $this->assertEquals(array('ISO-8859-1', '*', 'utf-8'), $request->getCharsets()); + $this->assertEquals(array('ISO-8859-1', 'utf-8', '*'), $request->getCharsets()); } public function testGetAcceptableContentTypes() @@ -925,7 +925,7 @@ public function testGetAcceptableContentTypes() $request = new Request(); $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*'); - $this->assertEquals(array('multipart/mixed', '*/*', 'text/html', 'application/xhtml+xml', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml', 'application/vnd.wap.wmlscriptc'), $request->getAcceptableContentTypes()); + $this->assertEquals(array('application/vnd.wap.wmlscriptc', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml', 'application/xhtml+xml', 'text/html', 'multipart/mixed', '*/*'), $request->getAcceptableContentTypes()); } public function testGetLanguages() @@ -938,6 +938,18 @@ public function testGetLanguages() $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages()); $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages()); + $request = new Request(); + $request->headers->set('Accept-language', 'zh, en-us; q=0.6, en; q=0.8'); + $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); // Test out of order qvalues + + $request = new Request(); + $request->headers->set('Accept-language', 'zh, en, en-us'); + $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); // Test equal weighting without qvalues + + $request = new Request(); + $request->headers->set('Accept-language', 'zh; q=0.6, en, en-us; q=0.6'); + $this->assertEquals(array('en', 'zh', 'en_US'), $request->getLanguages()); // Test equal weighting with qvalues + $request = new Request(); $request->headers->set('Accept-language', 'zh, i-cherokee; q=0.6'); $this->assertEquals(array('zh', 'cherokee'), $request->getLanguages());