I'm using a very simple force download script which includes a function to get the filesize from the intended target which is hosted remotely on S3.

This remote filesize function is bringing back the correct filesize in bytes:

76.07MB = 79768343 (The value returned by the said size script)

When I feed 79768343 into the Content-Length header I still get "Unknown Time Remaining" and no progress bar.

PHP Code:
<?php
    error_reporting
(0);
    
$file $_GET['file'];
    
$type $_GET['type'];

function 
remote_file_size ($url){ 
    
$head ""
    
$url_p parse_url($url); 
    
$host $url_p["host"]; 
    if(!
preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$host)){
        
// a domain name was given, not an IP
        
$ip=gethostbyname($host);
        if(!
preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$ip)){
            
//domain could not be resolved
            
return -1;
        }
    }
    
$port intval($url_p["port"]); 
    if(!
$port$port=80;
    
$path $url_p["path"]; 
    
//echo "Getting " . $host . ":" . $port . $path . " ...";

    
$fp fsockopen($host$port$errno$errstr20); 
    if(!
$fp) { 
        return 
false
        } else { 
        
fputs($fp"HEAD "  $url  " HTTP/1.1\r\n"); 
        
fputs($fp"HOST: " $host "\r\n"); 
        
fputs($fp"User-Agent: http://www.example.com/my_application\r\n");
        
fputs($fp"Connection: close\r\n\r\n"); 
        
$headers ""
        while (!
feof($fp)) { 
            
$headers .= fgets ($fp128); 
            } 
        } 
    
fclose ($fp); 
    
//echo $errno .": " . $errstr . "<br />";
    
$return = -2
    
$arr_headers explode("\n"$headers); 
    
// echo "HTTP headers for <a href='" . $url . "'>..." . substr($url,strlen($url)-20). "</a>:";
    // echo "<div class='http_headers'>";
    
foreach($arr_headers as $header) { 
        
// if (trim($header)) echo trim($header) . "<br />";
        
$s1 "HTTP/1.1"
        
$s2 "Content-Length: "
        
$s3 "Location: "
        if(
substr(strtolower ($header), 0strlen($s1)) == strtolower($s1)) $status substr($headerstrlen($s1)); 
        if(
substr(strtolower ($header), 0strlen($s2)) == strtolower($s2)) $size   substr($headerstrlen($s2));  
        if(
substr(strtolower ($header), 0strlen($s3)) == strtolower($s3)) $newurl substr($headerstrlen($s3));  
        } 
    
// echo "</div>";
    
if(intval($size) > 0) {
        
$return=intval($size);
    } else {
        
$return=$status;
    }
    
// echo intval($status) .": [" . $newurl . "]<br />";
    
if (intval($status)==302 && strlen($newurl) > 0) {
        
// 302 redirect: get HTTP HEAD of new URL
        
$return=remote_file_size($newurl);
    }
    return 
$return


     
$filesize remote_file_size($file);

    switch(
$_GET['type']) {
        case 
"mp3" $type "audio/mpeg"; break;
        case 
"wav" $type "audio/x-wav"; break;
        case 
"mpeg":
        case 
"mpg":
        case 
"mpe" $type="video/mpeg"; break;
        case 
"mov"$type "video/quicktime"; break;
        case 
"avi"$type="video/x-msvideo"; break;
        case 
"php":
      case 
"htm":
      case 
"html":
      case 
"txt": die("<b>Cannot be used for "$_GET['type']." files!</b>"); break;

      default: 
$type="application/force-download";
    }
    
    
$filename basename($file);

    
header("Pragma: public;"); // required
    
header("Expires: 0;");
    
header("Cache-Control: must-revalidate, post-check=0, pre-check=0;");
    
header("Cache-Control: private;",false); // required for certain browsers 
    
header("Content-Type: $type;");
    
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
    
header("Content-Transfer-Encoding: binary;");
    
header("Content-Length: ".$filesize.";");
    
readfile("$file"); 
    echo 
$filesize;
    exit();
?>