]> BookStack Code Mirror - bookstack/blobdiff - app/Http/RangeSupportedStream.php
Customization: Added parent tag classes
[bookstack] / app / Http / RangeSupportedStream.php
index b51d4a5498fc42428aa41ba2d656cb728c86e473..c4b00778939dd00fd20a762520051c4436be5d40 100644 (file)
@@ -13,8 +13,8 @@ use Illuminate\Http\Request;
  */
 class RangeSupportedStream
 {
-    protected string $sniffContent;
-    protected array $responseHeaders;
+    protected string $sniffContent = '';
+    protected array $responseHeaders = [];
     protected int $responseStatus = 200;
 
     protected int $responseLength = 0;
@@ -32,12 +32,12 @@ class RangeSupportedStream
     /**
      * Sniff a mime type from the stream.
      */
-    public function sniffMime(): string
+    public function sniffMime(string $extension = ''): string
     {
         $offset = min(2000, $this->fileSize);
         $this->sniffContent = fread($this->stream, $offset);
 
-        return (new WebSafeMimeSniffer())->sniff($this->sniffContent);
+        return (new WebSafeMimeSniffer())->sniff($this->sniffContent, $extension);
     }
 
     /**
@@ -53,16 +53,20 @@ class RangeSupportedStream
         }
 
         $outStream = fopen('php://output', 'w');
-        $sniffOffset = strlen($this->sniffContent);
+        $sniffLength = strlen($this->sniffContent);
+        $bytesToWrite = $this->responseLength;
 
-        if (!empty($this->sniffContent) && $this->responseOffset < $sniffOffset) {
-            $sniffOutput = substr($this->sniffContent, $this->responseOffset, min($sniffOffset, $this->responseLength));
+        if ($sniffLength > 0 && $this->responseOffset < $sniffLength) {
+            $sniffEnd = min($sniffLength, $bytesToWrite + $this->responseOffset);
+            $sniffOutLength = $sniffEnd - $this->responseOffset;
+            $sniffOutput = substr($this->sniffContent, $this->responseOffset, $sniffOutLength);
             fwrite($outStream, $sniffOutput);
+            $bytesToWrite -= $sniffOutLength;
         } else if ($this->responseOffset !== 0) {
             fseek($this->stream, $this->responseOffset);
         }
 
-        stream_copy_to_stream($this->stream, $outStream, $this->responseLength);
+        stream_copy_to_stream($this->stream, $outStream, $bytesToWrite);
 
         fclose($this->stream);
         fclose($outStream);
@@ -88,7 +92,7 @@ class RangeSupportedStream
             if ($start < 0 || $start > $end) {
                 $this->responseStatus = 416;
                 $this->responseHeaders['Content-Range'] = sprintf('bytes */%s', $this->fileSize);
-            } elseif ($end - $start < $this->fileSize - 1) {
+            } else {
                 $this->responseLength = $end < $this->fileSize ? $end - $start + 1 : -1;
                 $this->responseOffset = $start;
                 $this->responseStatus = 206;
@@ -124,10 +128,6 @@ class RangeSupportedStream
             $start = (int) $start;
         }
 
-        if ($start > $end) {
-            return null;
-        }
-
         $end = min($end, $this->fileSize - 1);
         return [$start, $end];
     }