예제 #1
0
 /**
  * {@inheritdoc}
  */
 public function read($length)
 {
     $this->initialize();
     if ($this->stream === null) {
         return null;
     }
     $data = $this->stream->read($length);
     if ($this->eof()) {
         $this->close();
     }
     return $data;
 }
 public function read($length)
 {
     $readFromBuffer = $this->buffer->read($length);
     if (strlen($readFromBuffer) === $length) {
         return $readFromBuffer;
     }
     $remaining = $length - strlen($readFromBuffer);
     // Calculate the approximate length required to read so that the base64 encoded stream does not have padding.
     // base64 is calculated for blocks of 3 input characters resulting in 4 output characters.
     // strlen(base64_encode($str)) ==> strlen($str) * 4 / 3
     //
     // This leads to:
     //
     // strlen($str) ==> strlen(base64_encode($str)) * 3 / 4
     //
     // Meaning, to read $length characters from the base64 encoded string, read 3/4 of $length from the original stream.
     // $length is first rounded to the first larger number divisible by 4 since base64 encoded strings come in blocks of 4 characters.
     $closestGroupLength = $remaining + (self::BASE64_BLOCK_SIZE - $remaining % self::BASE64_BLOCK_SIZE);
     $read = $closestGroupLength * self::ORIGIN_BLOCK_SIZE / self::BASE64_BLOCK_SIZE;
     $this->buffer->write(base64_encode($this->getStream()->read($read)));
     return $readFromBuffer . $this->buffer->read($remaining);
 }
예제 #3
0
 /**
  * {@inheritdoc}
  */
 public function close()
 {
     $this->stream->close();
 }