]> source.dussan.org Git - nextcloud-server.git/commitdiff
handle stream wrappers in SeekableHttpStream 32966/head
authorRobin Appelman <robin@icewind.nl>
Wed, 8 Jun 2022 15:52:27 +0000 (17:52 +0200)
committerbackportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com>
Tue, 21 Jun 2022 15:08:22 +0000 (15:08 +0000)
Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/private/Files/Stream/SeekableHttpStream.php

index fa6da7a1a53ecbff864e90e192aa9244e520dba5..8e9afb993cdd24ebd1a5a02538ed08621e028475 100644 (file)
@@ -25,6 +25,7 @@
 namespace OC\Files\Stream;
 
 use Icewind\Streams\File;
+use Icewind\Streams\Wrapper;
 
 /**
  * A stream wrapper that uses http range requests to provide a seekable stream for http reading
@@ -93,6 +94,18 @@ class SeekableHttpStream implements File {
                }
 
                $responseHead = stream_get_meta_data($this->current)['wrapper_data'];
+
+               while ($responseHead instanceof Wrapper) {
+                       $wrapperOptions = stream_context_get_options($responseHead->context);
+                       foreach ($wrapperOptions as $options) {
+                               if (isset($options['source']) && is_resource($options['source'])) {
+                                       $responseHead = stream_get_meta_data($options['source'])['wrapper_data'];
+                                       continue 2;
+                               }
+                       }
+                       throw new \Exception("Failed to get source stream from stream wrapper of " . get_class($responseHead));
+               }
+
                $rangeHeaders = array_values(array_filter($responseHead, function ($v) {
                        return preg_match('#^content-range:#i', $v) === 1;
                }));