Parcourir la source

ZF-10035: Fixes wrong S3 stream_read() implementation

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22621 44c647ce-9c0f-0410-b52a-842ac1e357ba
torio il y a 15 ans
Parent
commit
fdaed4531f

+ 11 - 2
library/Zend/Service/Amazon/S3/Stream.php

@@ -175,6 +175,10 @@ class Zend_Service_Amazon_S3_Stream
     /**
      * Read from the stream
      *
+     * http://bugs.php.net/21641 - stream_read() is always passed PHP's 
+     * internal read buffer size (8192) no matter what is passed as $count 
+     * parameter to fread(). 
+     *
      * @param  integer $count
      * @return string
      */
@@ -184,6 +188,11 @@ class Zend_Service_Amazon_S3_Stream
             return false;
         }
 
+        // make sure that count doesn't exceed object size
+        if ($count + $this->_position > $this->_objectSize) {
+            $count = $this->_objectSize - $this->_position;
+        }
+
         $range_start = $this->_position;
         $range_end = $this->_position+$count;
 
@@ -194,12 +203,12 @@ class Zend_Service_Amazon_S3_Stream
         if (($this->_position == 0) || (($range_end > strlen($this->_objectBuffer)) && ($range_end <= $this->_objectSize))) {
 
             $headers = array(
-                'Range' => "$range_start-$range_end"
+                'Range' => "bytes=$range_start-$range_end"
             );
 
             $response = $this->_s3->_makeRequest('GET', $this->_objectName, null, $headers);
 
-            if ($response->getStatus() == 200) {
+            if ($response->getStatus() == 206) { // 206 Partial Content
                 $this->_objectBuffer .= $response->getBody();
             }
         }

+ 15 - 11
tests/Zend/Service/Amazon/S3/StreamTest.php

@@ -81,14 +81,14 @@ class Zend_Service_Amazon_S3_StreamTest extends PHPUnit_Framework_TestCase
     public function tearDown()
     {
         $this->_amazon->unregisterStreamWrapper();
-    $buckets = $this->_amazon->getBuckets();
-    foreach($buckets as $bucket) {
-        if(substr($bucket, 0, strlen($this->_bucket)) != $this->_bucket) {
-            continue;
-        }
+        $buckets = $this->_amazon->getBuckets();
+        foreach($buckets as $bucket) {
+            if(substr($bucket, 0, strlen($this->_bucket)) != $this->_bucket) {
+                continue;
+            }
             $this->_amazon->cleanBucket($bucket);
-        $this->_amazon->removeBucket($bucket);
-    }
+            $this->_amazon->removeBucket($bucket);
+        }
     }
 
     /**
@@ -145,6 +145,7 @@ class Zend_Service_Amazon_S3_StreamTest extends PHPUnit_Framework_TestCase
     /**
      * Test reading from an object
      *
+     * @group ZF-10035
      * @return void
      */
     public function testReadObject()
@@ -169,12 +170,15 @@ class Zend_Service_Amazon_S3_StreamTest extends PHPUnit_Framework_TestCase
         $new_data = '';
 
         $f = fopen($this->_fileName, 'r');
+        fseek($f, 1000);
         while (!feof($f)) {
-            $new_data .= fread($f, 1024);
+            $chunk =  fread($f, 1000);
+            $new_data .= $chunk;
+            $this->assertEquals(strlen($chunk), 1000);
         }
         fclose($f);
 
-        $this->assertEquals($data, $new_data);
+        $this->assertEquals(substr($data, 1000), $new_data);
 
         unset($data);
         unset($new_data);
@@ -231,7 +235,7 @@ class Zend_Service_Amazon_S3_StreamTest extends PHPUnit_Framework_TestCase
         $result = mkdir($this->_bucketName);
         $this->assertTrue($result);
 
-    $this->assertTrue(is_dir($this->_bucketName));
+        $this->assertTrue(is_dir($this->_bucketName));
 
         $data = str_repeat('x', 10000);
         $len = strlen($data);
@@ -240,7 +244,7 @@ class Zend_Service_Amazon_S3_StreamTest extends PHPUnit_Framework_TestCase
         $size = file_put_contents($this->_fileName, $data);
         $this->assertEquals($len, $size);
 
-    $this->assertFalse(is_dir($this->_fileName));
+        $this->assertFalse(is_dir($this->_fileName));
 
         // Stat an object
         $info = stat($this->_fileName);