From: Alex Bligh Date: Mon, 3 Sep 2012 14:34:24 +0000 (+0100) Subject: Add content-length header; increase default block size; add timings; add IP address X-Git-Url: http://git.alex.org.uk Add content-length header; increase default block size; add timings; add IP address --- diff --git a/download.pl b/download.pl index 3f4c2ad..feadfa6 100755 --- a/download.pl +++ b/download.pl @@ -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);