Large chunks of our codebase and 3rd-party dependencies do not
use ->{psgi.errors}, so trying to standardize on it was a
fruitless endeavor. Since warn() and carp() are standard
mechanism within Perl, just use that instead and simplify a
bunch of existing code.
12 files changed:
# or smart HTTP. This is our wrapper for git-http-backend(1)
package PublicInbox::GitHTTPBackend;
use strict;
# or smart HTTP. This is our wrapper for git-http-backend(1)
package PublicInbox::GitHTTPBackend;
use strict;
use Fcntl qw(:seek);
use IO::Handle; # ->flush
use HTTP::Date qw(time2str);
use PublicInbox::Qspawn;
use PublicInbox::Tmpfile;
use PublicInbox::WwwStatic qw(r @NO_CACHE);
use Fcntl qw(:seek);
use IO::Handle; # ->flush
use HTTP::Date qw(time2str);
use PublicInbox::Qspawn;
use PublicInbox::Tmpfile;
use PublicInbox::WwwStatic qw(r @NO_CACHE);
# 32 is same as the git-daemon connection limit
my $default_limiter = PublicInbox::Qspawn::Limiter->new(32);
# 32 is same as the git-daemon connection limit
my $default_limiter = PublicInbox::Qspawn::Limiter->new(32);
serve_dumb($env, $git, $path);
}
serve_dumb($env, $git, $path);
}
-sub err ($@) {
- my ($env, @msg) = @_;
- $env->{'psgi.errors'}->print(@msg, "\n");
-}
+sub ucarp { Carp::carp(@_); undef }
my $input = $env->{'psgi.input'};
my $fd = eval { fileno($input) };
my $input = $env->{'psgi.input'};
my $fd = eval { fileno($input) };
- if (defined $fd && $fd >= 0) {
- return { 0 => $fd };
- }
+ return { 0 => $fd } if (defined $fd && $fd >= 0);
my $id = "git-http.input.$env->{REMOTE_ADDR}:$env->{REMOTE_PORT}";
my $id = "git-http.input.$env->{REMOTE_ADDR}:$env->{REMOTE_PORT}";
- my $in = tmpfile($id);
- unless (defined $in) {
- err($env, "could not open temporary file: $!");
- return;
- }
+ my $in = tmpfile($id) // return ucarp("tmpfile: $!");
- my $r = $input->read($buf, 8192);
- unless (defined $r) {
- err($env, "error reading input: $!");
- return;
- }
+ my $r = $input->read($buf, 8192) // return ucarp("read $!");
- unless (print $in $buf) {
- err($env, "error writing temporary file: $!");
- return;
- }
+ print $in $buf // return ucarp("print: $!");
}
# ensure it's visible to git-http-backend(1):
}
# ensure it's visible to git-http-backend(1):
- unless ($in->flush) {
- err($env, "error writing temporary file: $!");
- return;
- }
- unless (defined(sysseek($in, 0, SEEK_SET))) {
- err($env, "error seeking temporary file: $!");
- return;
- }
+ $in->flush // return ucarp("flush: $!");
+ sysseek($in, 0, SEEK_SET) // return ucarp($env, "seek: $!");
sub bail {
my $self = shift;
if (my $env = $self->{env}) {
sub bail {
my $self = shift;
if (my $env = $self->{env}) {
- eval { $env->{'psgi.errors'}->print(@_, "\n") };
- warn("E: error printing to psgi.errors: $@", @_) if $@;
my $http = $env->{'psgix.io'} or return; # client abort
eval { $http->close }; # should hit our close
warn "E: error in http->close: $@" if $@;
my $http = $env->{'psgix.io'} or return; # client abort
eval { $http->close }; # should hit our close
warn "E: error in http->close: $@" if $@;
- err($self, "response_write error: $@");
+ warn "response_write error: $@";
return; # likely
}
} elsif ($@) {
return; # likely
}
} elsif ($@) {
- err($self, "response ->getline error: $@");
+ warn "response ->getline error: $@";
$self->close;
}
# avoid recursion
if (delete $self->{forward}) {
eval { $forward->close };
if ($@) {
$self->close;
}
# avoid recursion
if (delete $self->{forward}) {
eval { $forward->close };
if ($@) {
- err($self, "response ->close error: $@");
+ warn "response ->close error: $@";
$self->close; # idempotent
}
}
$self->close; # idempotent
}
}
sub env_chunked { ($_[0]->{HTTP_TRANSFER_ENCODING} // '') =~ /\Achunked\z/i }
sub env_chunked { ($_[0]->{HTTP_TRANSFER_ENCODING} // '') =~ /\Achunked\z/i }
-sub err ($$) {
- eval { $_[0]->{httpd}->{env}->{'psgi.errors'}->print($_[1]."\n") };
-}
-
sub write_err {
my ($self, $len) = @_;
my $msg = $! || '(zero write)';
$msg .= " ($len bytes remaining)" if defined $len;
sub write_err {
my ($self, $len) = @_;
my $msg = $! || '(zero write)';
$msg .= " ($len bytes remaining)" if defined $len;
- err($self, "error buffering to input: $msg");
+ warn "error buffering to input: $msg";
if ($! == EAGAIN) { # epoll/kevent watch already set by do_read
$self->{input_left} = $len;
} else {
if ($! == EAGAIN) { # epoll/kevent watch already set by do_read
$self->{input_left} = $len;
} else {
- err($self, "error reading input: $! ($len bytes remaining)");
+ warn "error reading input: $! ($len bytes remaining)";
my $self = $_[0];
if (my $forward = delete $self->{forward}) {
eval { $forward->close };
my $self = $_[0];
if (my $forward = delete $self->{forward}) {
eval { $forward->close };
- err($self, "forward ->close error: $@") if $@;
+ warn "forward ->close error: $@" if $@;
}
$self->SUPER::close; # PublicInbox::DS::close
}
}
$self->SUPER::close; # PublicInbox::DS::close
}
# -cur_di, -qsp, -msg => temporary fields for Qspawn callbacks
inboxes => [ $self->{lxs}->locals, @rmt ],
}, 'PublicInbox::SolverGit';
# -cur_di, -qsp, -msg => temporary fields for Qspawn callbacks
inboxes => [ $self->{lxs}->locals, @rmt ],
}, 'PublicInbox::SolverGit';
- $lei->{env}->{'psgi.errors'} = $lei->{2}; # ugh...
local $PublicInbox::DS::in_loop = 0; # waitpid synchronously
$solver->solve($lei->{env}, $log, $self->{oid_b}, $hints);
}
local $PublicInbox::DS::in_loop = 0; # waitpid synchronously
$solver->solve($lei->{env}, $log, $self->{oid_b}, $hints);
}
$self->{gits} = [ map {
PublicInbox::Git->new($lei->rel2abs($_))
} @{$self->{lei}->{opt}->{'git-dir'}} ];
$self->{gits} = [ map {
PublicInbox::Git->new($lei->rel2abs($_))
} @{$self->{lei}->{opt}->{'git-dir'}} ];
- $lei->{env}->{'psgi.errors'} = $lei->{2}; # ugh...
$lei->{env}->{TMPDIR} = $self->{rdtmp}->dirname;
if (my $nr = ($lei->{opt}->{drq} || $lei->{opt}->{'dequote-only'})) {
my $re = '\s*> ' x $nr;
$lei->{env}->{TMPDIR} = $self->{rdtmp}->dirname;
if (my $nr = ($lei->{opt}->{drq} || $lei->{opt}->{'dequote-only'})) {
my $re = '\s*> ' x $nr;
sub attach_external {
my ($self, $ibxish) = @_; # ibxish = ExtSearch or Inbox
my $desc = $ibxish->{inboxdir} // $ibxish->{topdir};
sub attach_external {
my ($self, $ibxish) = @_; # ibxish = ExtSearch or Inbox
my $desc = $ibxish->{inboxdir} // $ibxish->{topdir};
- my $srch = $ibxish->search or
+ my $srch = $ibxish->search //
return warn("$desc not indexed for Xapian ($@ $!)\n");
my @shards = $srch->xdb_shards_flat or
return warn("$desc has no Xapian shards\n");
return warn("$desc not indexed for Xapian ($@ $!)\n");
my @shards = $srch->xdb_shards_flat or
return warn("$desc has no Xapian shards\n");
my $maxk = "external.$dir.maxuid";
my $stop_at = $lss ? $lss->{-cfg}->{$maxk} : undef;
if (defined $stop_at) {
my $maxk = "external.$dir.maxuid";
my $stop_at = $lss ? $lss->{-cfg}->{$maxk} : undef;
if (defined $stop_at) {
- die "$maxk=$stop_at has multiple values" if ref $stop_at;
- my @e;
- local $SIG{__WARN__} = sub { push @e, @_ };
- $stop_at += 0;
- return warn("$maxk=$stop_at: @e") if @e;
+ ref($stop_at) and
+ return warn("$maxk=$stop_at has multiple values\n");
+ ($stop_at =~ /[^0-9]/) and
+ return warn("$maxk=$stop_at not numeric\n");
}
$err = '';
if (-s $cerr) {
}
$err = '';
if (-s $cerr) {
- seek($cerr, 0, SEEK_SET) or
+ seek($cerr, 0, SEEK_SET) //
warn "seek($cmd stderr): $!";
$err = do { local $/; <$cerr> } //
warn "read($cmd stderr): $!";
warn "seek($cmd stderr): $!";
$err = do { local $/; <$cerr> } //
warn "read($cmd stderr): $!";
- truncate($cerr, 0) or
- warn "truncate($cmd stderr): $!";
+ truncate($cerr, 0) // warn "truncate($cmd stderr): $!";
}
next if (($? >> 8) == 22 && $err =~ /\b404\b/);
$uri->query_form(q => $qstr);
}
next if (($? >> 8) == 22 && $err =~ /\b404\b/);
$uri->query_form(q => $qstr);
if (my $lxs = delete $lei->{lxs}) {
$lxs->wq_wait_old(\&xsearch_done_wait, $lei);
}
if (my $lxs = delete $lei->{lxs}) {
$lxs->wq_wait_old(\&xsearch_done_wait, $lei);
}
- if ($lei->{opt}->{'mail-sync'} && !$lei->{sto}) {
+ ($lei->{opt}->{'mail-sync'} && !$lei->{sto}) and
warn "BUG: {sto} missing with --mail-sync";
warn "BUG: {sto} missing with --mail-sync";
$lei->sto_done_request if $lei->{sto};
my $wait = $lei->{v2w} ? $lei->{v2w}->wq_do('done') : undef;
$lei->{ovv}->ovv_end($lei);
$lei->sto_done_request if $lei->{sto};
my $wait = $lei->{v2w} ? $lei->{v2w}->wq_do('done') : undef;
$lei->{ovv}->ovv_end($lei);
-sub log_err ($$) {
- my ($env, $msg) = @_;
- $env->{'psgi.errors'}->print($msg, "\n");
-}
-
sub finalize ($$) {
my ($self, $err) = @_;
sub finalize ($$) {
my ($self, $err) = @_;
$self->{err} = $err;
}
if ($env && $self->{cmd}) {
$self->{err} = $err;
}
if ($env && $self->{cmd}) {
- log_err($env, join(' ', @{$self->{cmd}}) . ": $err");
+ warn join(' ', @{$self->{cmd}}) . ": $err";
# PSGI servers.
sub event_step {
my ($self, $err) = @_; # $err: $!
# PSGI servers.
sub event_step {
my ($self, $err) = @_; # $err: $!
- log_err($self->{psgi_env}, "psgi_{return,qx} $err") if defined($err);
+ warn "psgi_{return,qx} $err" if defined($err);
finish($self);
my ($fh, $qx_fh) = delete(@$self{qw(fh qx_fh)});
$fh->close if $fh; # async-only (psgi_return)
finish($self);
my ($fh, $qx_fh) = delete(@$self{qw(fh qx_fh)});
$fh->close if $fh; # async-only (psgi_return)
$total_rd += $r;
eval { $ret = $ph_cb->($total_rd, $hdr_buf, $ph_arg) };
if ($@) {
$total_rd += $r;
eval { $ret = $ph_cb->($total_rd, $hdr_buf, $ph_arg) };
if ($@) {
- log_err($self->{psgi_env}, "parse_hdr: $@");
$ret = [ 500, [], [ "Internal error\n" ] ];
}
} else {
# caller should notify us when it's ready:
return if $! == EAGAIN;
next if $! == EINTR; # immediate retry
$ret = [ 500, [], [ "Internal error\n" ] ];
}
} else {
# caller should notify us when it's ready:
return if $! == EAGAIN;
next if $! == EINTR; # immediate retry
- log_err($self->{psgi_env}, "error reading header: $!");
+ warn "error reading header: $!";
$ret = [ 500, [], [ "Internal error\n" ] ];
}
} until (defined $ret);
$ret = [ 500, [], [ "Internal error\n" ] ];
}
} until (defined $ret);
foreach my $m ($mset->items) {
my $num = shift @nums;
foreach my $m ($mset->items) {
my $num = shift @nums;
- my $smsg = delete($num2msg{$num}) or do {
- eval {
- $m = "$m $num expired\n";
- $ctx->{env}->{'psgi.errors'}->print($m);
- };
+ my $smsg = delete($num2msg{$num}) // do {
+ warn "$m $num expired\n";
next;
};
my $mid = $smsg->{mid};
next;
};
my $mid = $smsg->{mid};
}
my $user = eval { $self->{cipher}->decrypt(decode_base64url($u)) };
if (!defined $user || index($user, '@') < 1) {
}
my $user = eval { $self->{cipher}->decrypt(decode_base64url($u)) };
if (!defined $user || index($user, '@') < 1) {
- my $err = quotemeta($@);
- my $errors = $env->{'psgi.errors'};
- $errors->print("error decrypting: $u\n");
- $errors->print("$_\n") for split("\n", $err);
+ warn "error decrypting: $u: ", ($@ ? quotemeta($@) : ());
$u = Plack::Util::encode_html($u);
return r($self, 400, 'Bad request', "Failed to decrypt: $u");
}
$u = Plack::Util::encode_html($u);
return r($self, 400, 'Bad request', "Failed to decrypt: $u");
}
'text/plain; charset=UTF-8', @cl ] ];
}
if ($r == 0) {
'text/plain; charset=UTF-8', @cl ] ];
}
if ($r == 0) {
- warn "premature EOF on $oid $$logref\n";
+ warn "premature EOF on $oid $$logref";
return html_page($ctx, 500, $logref);
}
@$ctx{qw(-res -logref)} = ($res, $logref);
return html_page($ctx, 500, $logref);
}
@$ctx{qw(-res -logref)} = ($res, $logref);
my ($log, $hints, $fn) = delete @$ctx{qw(log hints fn)};
unless (seek($log, 0, 0)) {
my ($log, $hints, $fn) = delete @$ctx{qw(log hints fn)};
unless (seek($log, 0, 0)) {
- $ctx->{env}->{'psgi.errors'}->print("seek(log): $!\n");
return html_page($ctx, 500, \'seek error');
}
$log = do { local $/; <$log> };
return html_page($ctx, 500, \'seek error');
}
$log = do { local $/; <$log> };
my $blob = $git->cat_file($oid);
if (!$blob) { # WTF?
my $e = "Failed to retrieve generated blob ($oid)";
my $blob = $git->cat_file($oid);
if (!$blob) { # WTF?
my $e = "Failed to retrieve generated blob ($oid)";
- $ctx->{env}->{'psgi.errors'}->print("$e ($git->{git_dir})\n");
+ warn "$e ($git->{git_dir})";
$log = "<pre><b>$e</b></pre>" . $log;
return html_page($ctx, 500, \$log);
}
$log = "<pre><b>$e</b></pre>" . $log;
return html_page($ctx, 500, \$log);
}
my ($r, $bref, $ctx) = @_;
return html_oneshot($ctx, 500) if !defined($r);
if ($r == 0) {
my ($r, $bref, $ctx) = @_;
return html_oneshot($ctx, 500) if !defined($r);
if ($r == 0) {
- my $err = eval { $ctx->{env}->{'psgi.errors'} } // \*STDERR;
- $err->print("unexpected EOF from sqlite3\n");
+ warn 'unexpected EOF from sqlite3';
return html_oneshot($ctx, 501);
}
[200, [ qw(Content-Type application/gzip), 'Content-Disposition',
return html_oneshot($ctx, 501);
}
[200, [ qw(Content-Type application/gzip), 'Content-Disposition',
return \$buf if $r == 0;
$off += $r;
}
return \$buf if $r == 0;
$off += $r;
}
- $env->{'psgi.errors'}->print("input read error: $!\n");
+ warn "input read error: $!";