*/
class RangeSupportedStream
{
- protected string $sniffContent;
- protected array $responseHeaders;
+ protected string $sniffContent = '';
+ protected array $responseHeaders = [];
protected int $responseStatus = 200;
protected int $responseLength = 0;
/**
* 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);
}
/**
}
$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);
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;
$start = (int) $start;
}
- if ($start > $end) {
- return null;
- }
-
$end = min($end, $this->fileSize - 1);
return [$start, $end];
}