diff options
author | Eric Wong <e@80x24.org> | 2020-01-01 10:38:57 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2020-01-01 19:10:59 +0000 |
commit | 7dddc72dd59b8947696cf0563034fda672b67905 (patch) | |
tree | 7c306edd53a37a1d19ecaa592e3af06243828a5c /lib/PublicInbox/WwwStatic.pm | |
parent | 02f9b34f398bef722159cd54a629441f861d37b7 (diff) | |
download | public-inbox-7dddc72dd59b8947696cf0563034fda672b67905.tar.gz |
open() is a much more expensive syscall than stat(), so avoid it
Diffstat (limited to 'lib/PublicInbox/WwwStatic.pm')
-rw-r--r-- | lib/PublicInbox/WwwStatic.pm | 17 |
1 files changed, 12 insertions, 5 deletions
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 ]; } |