--- file.orig.inc 2006-10-19 14:41:52.000000000 +0300 +++ file.inc 2006-10-30 02:16:45.000000000 +0200 @@ -561,8 +561,44 @@ // Transfer file in 1024 byte chunks to save memory usage. if ($fd = fopen($source, 'rb')) { + + // Tell that we accept byte-ranges + header('Accept-Ranges: bytes'); + + // Get filesize. + $filesize = filesize($source); + + if(isset($_SERVER['HTTP_RANGE'])) { + // This is a partial request. + $range=substr($_SERVER['HTTP_RANGE'],strpos($_SERVER['HTTP_RANGE'],'=')+1); + list($range_from,$range_to) = explode('-', $range); + + // Confirm that no funnybussines is being made + $range_from = intval($range_from); + $range_to = intval($range_to); + if($range_to+1 > $filesize) $range_to = $filesize-1; + if($range_from >= $range_to) $range_from = 0; + + // Send appropiate headers + header('HTTP/1.1 206 Partial Content'); + header('Content-Range: bytes '.$range_from.'-'.$range_to.'/'.$filesize); + header('Content-Length: '.($range_to-$range_from+1)); + // Move file pointer + fseek($fd,$range_from); + } else { + $range_from=0; + $range_to=$filesize-1; + // Send filesize + header('Content-Length: '.$filesize); + } + + $r = $range_to-$range_from; while (!feof($fd)) { - print fread($fd, 1024); + if($r > 1024) { + $r-1024; + print fread($fd, 1024); + } else { + print fread($fd, $r); + break; + } } fclose($fd); }