From e4e3a7504e22b4afc96c1a475802dd84ffa9ead6 Mon Sep 17 00:00:00 2001 From: wapplay Date: Sun, 21 Oct 2018 01:54:30 +0300 Subject: [PATCH] Test streamWrapper extract (issue #24) --- src/PhpZip/Stream/ZipInputStream.php | 8 +++ tests/PhpZip/Issue24Test.php | 104 +++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 tests/PhpZip/Issue24Test.php diff --git a/src/PhpZip/Stream/ZipInputStream.php b/src/PhpZip/Stream/ZipInputStream.php index b8e084d..b14fd9c 100644 --- a/src/PhpZip/Stream/ZipInputStream.php +++ b/src/PhpZip/Stream/ZipInputStream.php @@ -483,6 +483,14 @@ public function readEntryContent(ZipEntry $entry) throw new ZipUnsupportMethodException($entry->getName() . " (compression method " . $method . " is not supported)"); } + + if ($content === false) { + throw new ZipException(sprintf( + 'Failed to get the contents of the zip entry "%s"', + $entry->getName() + )); + } + if (!$skipCheckCrc) { $localCrc = crc32($content); $localCrc = PHP_INT_SIZE === 4 ? sprintf('%u', $localCrc) : $localCrc; diff --git a/tests/PhpZip/Issue24Test.php b/tests/PhpZip/Issue24Test.php new file mode 100644 index 0000000..ddf040e --- /dev/null +++ b/tests/PhpZip/Issue24Test.php @@ -0,0 +1,104 @@ +addFromString( + 'file.txt', + $fileContents, + ZipFile::METHOD_DEFLATED + ); + $zip->saveAsFile($this->outputFilename); + $zip->close(); + + $this->assertCorrectZipArchive($this->outputFilename); + + $stream = fopen('dummyfs://localhost/' . $this->outputFilename, 'rb'); + $this->assertNotFalse($stream); + $zip->openFromStream($stream); + $this->assertEquals($zip->getListFiles(), ['file.txt']); + $this->assertEquals($zip['file.txt'], $fileContents); + $zip->close(); + } +} + +/** + * Try to load using dummy stream + */ +class DummyFileSystemStream +{ + /** + * @var resource + */ + private $fp; + + function stream_open($path, $mode, $options, &$opened_path) + { +// echo "DummyFileSystemStream->stream_open($path, $mode, $options)" . PHP_EOL; + + $parsedUrl = parse_url($path); + $path = $parsedUrl['path']; + $this->fp = fopen($path, $mode); + + return true; + } + + function stream_read($count) + { +// echo "DummyFileSystemStream->stream_read($count)" . PHP_EOL; + $position = ftell($this->fp); + +// echo "Loading chunk " . $position . " to " . ($position + $count - 1) . PHP_EOL; + $ret = fread($this->fp, $count); + +// echo "String length: " . strlen($ret) . PHP_EOL; + + return $ret; + } + + function stream_tell() + { +// echo "DummyFileSystemStream->stream_tell()" . PHP_EOL; + return ftell($this->fp); + } + + function stream_eof() + { +// echo "DummyFileSystemStream->stream_eof()" . PHP_EOL; + $isfeof = feof($this->fp); + return $isfeof; + } + + function stream_seek($offset, $whence) + { +// echo "DummyFileSystemStream->stream_seek($offset, $whence)" . PHP_EOL; + fseek($this->fp, $offset, $whence); + } + + function stream_stat() + { +// echo "DummyFileSystemStream->stream_stat()" . PHP_EOL; + return fstat($this->fp); + } +} \ No newline at end of file