From d31ff51785f42e3de255722a32f098ab49d1489c Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Thu, 4 Sep 2014 22:32:08 +0200 Subject: [ticket/13031] Guess with all mimetype guessers and pick best guess PHPBB3-13031 --- phpBB/phpbb/mimetype/guesser.php | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) (limited to 'phpBB/phpbb') diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php index 773a1f822a..c019cb5b07 100644 --- a/phpBB/phpbb/mimetype/guesser.php +++ b/phpBB/phpbb/mimetype/guesser.php @@ -115,17 +115,42 @@ class guesser return false; } + $mimetype = 'application/octet-stream'; + foreach ($this->guessers as $guesser) { - $mimetype = $guesser->guess($file, $file_name); + $mimetype_guess = $guesser->guess($file, $file_name); - // Try to guess something that is not the fallback application/octet-stream - if ($mimetype !== null && $mimetype !== 'application/octet-stream') - { - return $mimetype; - } + $mimetype = $this->choose_mime_type($mimetype, $mimetype_guess); } // Return any mimetype if we got a result or the fallback value - return (!empty($mimetype)) ? $mimetype : 'application/octet-stream'; + return $mimetype; + } + + /** + * Choose the best mime type based on the current mime type and the guess + * If a guesser returns nulls or application/octet-stream, we will keep + * the current guess. Guesses with a slash inside them will be favored over + * already existing without slashes. However, any guess that will pass the + * first check will always overwrite the default application/octet-stream. + * + * @param string $mime_type The current mime type + * @param string $guess The current mime type guess + * + * @return string The best mime type based on current mime type and guess + */ + protected function choose_mime_type($mime_type, $guess) + { + if ($guess === null || $guess == 'application/octet-stream') + { + return $mime_type; + } + + if ((strpos($mime_type, '/') === false || $mime_type == 'application/octet-stream') && strpos($guess, '/') !== false) + { + $mime_type = $guess; + } + + return $mime_type; } } -- cgit v1.2.1 From 21029e9fd295bedfcc34555d32afd928a03392a1 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Fri, 5 Sep 2014 21:55:49 +0200 Subject: [ticket/13031] Slightly change behavior of choose_mime_type and add unit tests The mime type 'application/octet-stream' will still always be overwritten by proper guesses. However, guesses with guessers that have a higher priority will now overwrite previous guesses even if the mime types of these guesses had a slash in them. PHPBB3-13031 --- phpBB/phpbb/mimetype/guesser.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'phpBB/phpbb') diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php index c019cb5b07..8baa77089b 100644 --- a/phpBB/phpbb/mimetype/guesser.php +++ b/phpBB/phpbb/mimetype/guesser.php @@ -131,22 +131,22 @@ class guesser * Choose the best mime type based on the current mime type and the guess * If a guesser returns nulls or application/octet-stream, we will keep * the current guess. Guesses with a slash inside them will be favored over - * already existing without slashes. However, any guess that will pass the - * first check will always overwrite the default application/octet-stream. + * already existing ones. However, any guess that will pass the first check + * will always overwrite the default application/octet-stream. * * @param string $mime_type The current mime type * @param string $guess The current mime type guess * * @return string The best mime type based on current mime type and guess */ - protected function choose_mime_type($mime_type, $guess) + public function choose_mime_type($mime_type, $guess) { if ($guess === null || $guess == 'application/octet-stream') { return $mime_type; } - if ((strpos($mime_type, '/') === false || $mime_type == 'application/octet-stream') && strpos($guess, '/') !== false) + if ($mime_type == 'application/octet-stream' || strpos($guess, '/') !== false) { $mime_type = $guess; } -- cgit v1.2.1