From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 8F89C1F4B9 for ; Wed, 1 Jan 2020 10:39:00 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/6] wwwstatic: do not open() files for HEAD requests Date: Wed, 1 Jan 2020 10:38:57 +0000 Message-Id: <20200101103859.15401-5-e@80x24.org> In-Reply-To: <20200101103859.15401-1-e@80x24.org> References: <20200101103859.15401-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: open() is a much more expensive syscall than stat(), so avoid it --- lib/PublicInbox/WwwStatic.pm | 17 ++++++++++++----- 1 file 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 ]; }