From: Eric Wong Date: Wed, 1 Jan 2020 10:38:57 +0000 (+0000) Subject: wwwstatic: do not open() files for HEAD requests X-Git-Tag: v1.3.0~167 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=7dddc72dd59b8947696cf0563034fda672b67905 wwwstatic: do not open() files for HEAD requests open() is a much more expensive syscall than stat(), so avoid it --- diff --git a/lib/PublicInbox/WwwStatic.pm b/lib/PublicInbox/WwwStatic.pm index c605e64f..093a7920 100644 --- a/lib/PublicInbox/WwwStatic.pm +++ b/lib/PublicInbox/WwwStatic.pm @@ -51,7 +51,9 @@ sub prepare_range { if ($len <= 0) { $code = 416; } else { - sysseek($in, $beg, SEEK_SET) or return r(500); + if ($in) { + sysseek($in, $beg, SEEK_SET) or return r(500); + } push @$h, qw(Accept-Ranges bytes Content-Range); push @$h, "bytes $beg-$end/$size"; @@ -70,8 +72,13 @@ sub response { my ($env, $h, $path, $type) = @_; return r(404) unless -f $path && -r _; # just in case it's a FIFO :P - open my $in, '<', $path or return; - my $size = -s $in; + my ($size, $in); + if ($env->{REQUEST_METHOD} eq 'HEAD') { + $size = -s _; + } else { # GET, callers should've already filtered out other methods + open $in, '<', $path or return r(403); + $size = -s $in; + } my $mtime = time2str((stat(_))[9]); if (my $ims = $env->{HTTP_IF_MODIFIED_SINCE}) { @@ -86,13 +93,13 @@ sub response { return $code if ref($code); } push @$h, 'Content-Length', $len, 'Last-Modified', $mtime; - my $body = bless { + my $body = $in ? bless { initial_rd => 65536, len => $len, in => $in, path => $path, env => $env, - }, __PACKAGE__; + }, __PACKAGE__ : []; [ $code, $h, $body ]; }