Add content-length header; increase default block size; add timings; add IP address master
authorAlex Bligh <alex@alex.org.uk>
Mon, 3 Sep 2012 14:34:24 +0000 (15:34 +0100)
committerAlex Bligh <alex@alex.org.uk>
Mon, 3 Sep 2012 14:34:24 +0000 (15:34 +0100)
download.pl

index 3f4c2ad..feadfa6 100755 (executable)
@@ -27,13 +27,16 @@ my $secretfile="/etc/apache2/download.secret";
 my $secret;
 my $sentheader = 0;
 my $maxdrift = 60;
+my $remoteip;
+my $t0 = [gettimeofday];
+my $filesize;
 
 sub lprintf
 {
     if (defined($log))
     {
        my $now = strftime "%a, %d %b %Y %T %z", localtime;
-       print $log "$now: [$$][$transaction]: ";
+       printf $log "$now: [$$:%s][$transaction]: ", defined($remoteip)?$remoteip:"unknown";
        printf $log @_;
     }
 }
@@ -54,7 +57,8 @@ sub openlog
 sub qdie
 {
     my $err = shift @_;
-    lprintf "ERROR: $err\n";
+    my $elapsed = tv_interval ( $t0, [gettimeofday]);
+    lprintf "ERROR: $err after %.3f secs\n", $elapsed;
     if (!$sentheader)
     {
        my $error = encode_entities( $err );
@@ -83,12 +87,13 @@ sub sendfile {
     $sentheader = 1;
     print CGI::header(
         -type => 'application/octet-stream',
+       -Content_length=> $filesize,
         -attachment => $name,
        );
 
     binmode STDOUT, ':raw';
 
-    unless (copy $fh => \*STDOUT, 8192)
+    unless (copy $fh => \*STDOUT, 65536)
     {
        qdie "Cannot write to STDOUT";
     }
@@ -121,8 +126,9 @@ sub decodeparams
     my $clientfile = CGI::url_param('file');
     $clientfile = "default" unless(defined($clientfile));
     qdie ("Bad parameters") unless (defined($clienttime) && defined($clientid) && defined($clienthash) && ($clienttime=~/^[0-9]+$/));
-    my $drift = time()-$clienttime;
-    qdie ("Client time has drifted - we have ".time()) if (($drift < -$maxdrift) || ($drift > $maxdrift));
+    my $now = time();
+    my $drift = $now-$clienttime;
+    qdie ("Client time has drifted - $now - $clienttime = $drift") if (($drift < -$maxdrift) || ($drift > $maxdrift));
     qdie ("Bad ID") unless ($clientid=~/^[-+._\@a-zA-Z0-9]+$/);
     qdie ("Bad filename") unless ($clientfile=~/^[-+._a-zA-Z0-9]+$/);
     qdie ("Bad filename") if ($clientfile=~/^\./);
@@ -182,12 +188,12 @@ else
        doinfo($info);
        exit 0;
     }
+    $remoteip = CGI::remote_addr();
 
     openlog;
     my $file = decodeparams;
     my $sb = stat($file);
-    my $size = $sb->size;
-    my $t0 = [gettimeofday];
+    $filesize = $sb->size;
     lprintf("STARTING\n");
     $SIG{INT} = \&caughtsignal;
     $SIG{QUIT} = \&caughtsignal;
@@ -197,7 +203,8 @@ else
     $SIG{TERM} = \&caughtsignal;
     sendfile($file);
     my $elapsed = tv_interval ( $t0, [gettimeofday]);
-    lprintf("SUCCESS %d bytes %.3f MB/s\n", $size, $size/(1000000.0*(($elapsed<0.001)?0.001:$elapsed)));
+    my $rate = $filesize/(1000000.0*(($elapsed<0.001)?0.001:$elapsed));
+    lprintf("SUCCESS %d bytes %.3f MB/s %.3f secs\n", $filesize, $rate, $elapsed);
     closelog;
 
     exit(0);