From 61acaf1fbda8b340efaefff2588bd570c66bfb55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pauli=20J=C3=A4rvinen?= Date: Sat, 11 Sep 2021 17:42:15 +0300 Subject: [PATCH] Support seeking also from the end of file on S3 storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PR https://github.com/nextcloud/server/pull/20033 added support for `fseek` for the S3 storage backend. However, the seek mode SEEK_END was left out that time. This PR fills this gap. Signed-off-by: Pauli Järvinen --- lib/private/Files/Stream/SeekableHttpStream.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/private/Files/Stream/SeekableHttpStream.php b/lib/private/Files/Stream/SeekableHttpStream.php index efbfd293ad5fc..fa6da7a1a53ec 100644 --- a/lib/private/Files/Stream/SeekableHttpStream.php +++ b/lib/private/Files/Stream/SeekableHttpStream.php @@ -77,6 +77,8 @@ public static function open(callable $callback) { private $current; /** @var int */ private $offset = 0; + /** @var int */ + private $length = 0; private function reconnect(int $start) { $range = $start . '-'; @@ -102,12 +104,14 @@ private function reconnect(int $start) { $content = trim(explode(':', $contentRange)[1]); $range = trim(explode(' ', $content)[1]); $begin = intval(explode('-', $range)[0]); + $length = intval(explode('/', $range)[1]); if ($begin !== $start) { return false; } $this->offset = $begin; + $this->length = $length; return true; } @@ -141,7 +145,12 @@ public function stream_seek($offset, $whence = SEEK_SET) { } return $this->reconnect($this->offset + $offset); case SEEK_END: - return false; + if ($this->length === 0) { + return false; + } elseif ($this->length + $offset === $this->offset) { + return true; + } + return $this->reconnect($this->length + $offset); } return false; }