Explorar o código

Merge pull request #230 from OndraM/mime-tests-php52

Refactor mime type detection to be reusable; skip test in PHP 5.2
Matthew Weier O'Phinney %!s(int64=12) %!d(string=hai) anos
pai
achega
8e81c85095

+ 3 - 20
library/Zend/Validate/File/ExcludeMimeType.php

@@ -73,27 +73,10 @@ class Zend_Validate_File_ExcludeMimeType extends Zend_Validate_File_MimeType
             return $this->_throw($file, self::NOT_READABLE);
         }
 
-        $mimefile = $this->getMagicFile();
-        if (class_exists('finfo', false)) {
-            $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
-            if (!empty($mimefile)) {
-                $mime = new finfo($const, $mimefile);
-            } else {
-                $mime = new finfo($const);
-            }
-
-            if (!empty($mime)) {
-                $this->_type = $mime->file($value);
-            }
-            unset($mime);
-        }
+        $this->_type = $this->_detectMimeType($value);
 
-        if (empty($this->_type)) {
-            if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) {
-                $this->_type = mime_content_type($value);
-            } elseif ($this->_headerCheck) {
-                $this->_type = $file['type'];
-            }
+        if (empty($this->_type) && $this->_headerCheck) {
+            $this->_type = $file['type'];
         }
 
         if (empty($this->_type)) {

+ 36 - 22
library/Zend/Validate/File/MimeType.php

@@ -209,7 +209,7 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
             throw new Zend_Validate_Exception('The given magicfile can not be read');
         } else {
             $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
-            $this->_finfo = @finfo_open($const, $file);
+            $this->_finfo = finfo_open($const, $file);
             if (empty($this->_finfo)) {
                 $this->_finfo = null;
                 require_once 'Zend/Validate/Exception.php';
@@ -368,27 +368,7 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
             return $this->_throw($file, self::NOT_READABLE);
         }
 
-        $mimefile = $this->getMagicFile();
-        if (class_exists('finfo', false)) {
-            $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
-            if (!empty($mimefile) && empty($this->_finfo)) {
-                $this->_finfo = @finfo_open($const, $mimefile);
-            }
-
-            if (empty($this->_finfo)) {
-                $this->_finfo = @finfo_open($const);
-            }
-
-            $this->_type = null;
-            if (!empty($this->_finfo)) {
-                $this->_type = finfo_file($this->_finfo, $value);
-            }
-        }
-
-        if (empty($this->_type) &&
-            (function_exists('mime_content_type') && ini_get('mime_magic.magicfile'))) {
-                $this->_type = mime_content_type($value);
-        }
+        $this->_type = $this->_detectMimeType($value);
 
         if (empty($this->_type) && $this->_headerCheck) {
             $this->_type = $file['type'];
@@ -428,4 +408,38 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract
         $this->_error($errorType);
         return false;
     }
+
+    /**
+     * Try to detect mime type of given file.
+     * @param string $file File which mime type should be detected
+     * @return string File mime type or null if not detected
+     */
+    protected function _detectMimeType($file)
+    {
+        $mimefile = $this->getMagicFile();
+        $type = null;
+
+        if (class_exists('finfo', false)) {
+            $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
+
+            if (!empty($mimefile) && empty($this->_finfo)) {
+                $this->_finfo = finfo_open($const, $mimefile);
+            }
+
+            if (empty($this->_finfo)) {
+                $this->_finfo = finfo_open($const);
+            }
+
+            if (!empty($this->_finfo)) {
+                $type = finfo_file($this->_finfo, $file);
+            }
+        }
+
+        if (empty($type) &&
+            (function_exists('mime_content_type') && ini_get('mime_magic.magicfile'))) {
+                $type = mime_content_type($file);
+        }
+
+        return $type;
+    }
 }

+ 11 - 7
tests/Zend/Validate/File/MimeTypeTest.php

@@ -236,7 +236,7 @@ class Zend_Validate_File_MimeTypeTest extends PHPUnit_Framework_TestCase
             );
         }
     }
-    
+
     /**
      * @group ZF-11784
      */
@@ -244,10 +244,10 @@ class Zend_Validate_File_MimeTypeTest extends PHPUnit_Framework_TestCase
     {
         $validator = new Zend_Validate_File_MimeType('image/jpeg');
         $this->assertTrue($validator->shouldTryCommonMagicFiles());
-        
+
         $validator->setTryCommonMagicFilesFlag(false);
         $this->assertFalse($validator->shouldTryCommonMagicFiles());
-        
+
         $validator->setTryCommonMagicFilesFlag(true);
         $this->assertTrue($validator->shouldTryCommonMagicFiles());
     }
@@ -257,6 +257,10 @@ class Zend_Validate_File_MimeTypeTest extends PHPUnit_Framework_TestCase
      */
     public function testDisablingTryCommonMagicFilesIgnoresCommonLocations()
     {
+        if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+            $this->markTestSkipped('Behavior is only applicable and testable for PHP 5.3+');
+        }
+
         $filetest = dirname(__FILE__) . '/_files/picture.jpg';
         $files = array(
             'name'     => 'picture.jpg',
@@ -264,13 +268,13 @@ class Zend_Validate_File_MimeTypeTest extends PHPUnit_Framework_TestCase
             'tmp_name' => $filetest,
             'error'    => 0
         );
-        
+
         $validator = new Zend_Validate_File_MimeType(array('image/jpeg', 'image/jpeg; charset=binary'));
-        
+
         $goodEnvironment = $validator->isValid($filetest, $files);
-        
+
         if ($goodEnvironment) {
-            /** 
+            /**
              * The tester's environment has magic files that are properly read by PHP
              * This prevents the test from being relevant in the environment
              */