/** * Read storage * * @param \XLite\Model\Base\Storage $storage Storage * * @return void */ protected function readStorage(\XLite\Model\Base\Storage $storage) { $range = null; if (isset($_SERVER['HTTP_RANGE'])) { list($sizeUnit, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); if ('bytes' == $sizeUnit) { list($range, $extra) = explode(',', $range, 2); } } $start = null; $length = $storage->getSize(); if ($range) { $size = $length; list($start, $end) = explode('-', $range, 2); $start = abs(intval($start)); $end = abs(intval($end)); $end = $end ? min($end, $size - 1) : $size - 1; $start = !$start || $end < $start ? 0 : max($start, 0); if ($start > 0 || $end < $size - 1) { header('HTTP/1.1 206 Partial Content', true, 206); } header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size); $length = $end - $start + 1; } header('Accept-Ranges: bytes'); header('Content-Length: ' . $length); if (!\XLite\Core\Request::getInstance()->isHead()) { $storage->readOutput($start, $length); } }