X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FInbox.pm;h=b0bb9dcc288daa328cfd44da340d4ae74a274a2b;hb=b587bfbcbff710dc9667af85be6a2a619f918273;hp=bee44f8a92e7ae8861b01064ff10831605b51a1f;hpb=af0b0fb7a454470a32c452119d0392e0dedb3fe1;p=public-inbox.git diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index bee44f8a..b0bb9dcc 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -8,6 +8,7 @@ use PublicInbox::Git; use PublicInbox::MID qw(mid2path); use PublicInbox::Eml; use List::Util qw(max); +use Carp qw(croak); # Long-running "git-cat-file --batch" processes won't notice # unlinked packs, so we need to restart those processes occasionally. @@ -168,8 +169,8 @@ sub max_git_epoch { } sub mm { - my ($self) = @_; - $self->{mm} ||= eval { + my ($self, $req) = @_; + $self->{mm} //= eval { require PublicInbox::Msgmap; my $dir = $self->{inboxdir}; if ($self->version >= 2) { @@ -177,7 +178,7 @@ sub mm { } else { PublicInbox::Msgmap->new($dir); } - }; + } // ($req ? croak("E: $@") : undef); } sub search { @@ -195,19 +196,19 @@ sub search { sub isrch { $_[0]->{isrch} // search($_[0]) } sub over { - $_[0]->{over} //= eval { - my $srch = $_[0]->{search} //= eval { - _cleanup_later($_[0]); + my ($self, $req) = @_; + $self->{over} //= eval { + my $srch = $self->{search} //= do { + _cleanup_later($self); require PublicInbox::Search; - PublicInbox::Search->new($_[0]); + PublicInbox::Search->new($self); }; my $over = PublicInbox::Over->new("$srch->{xpfx}/over.sqlite3"); $over->dbh; # may fail $over; - }; + } // ($req ? croak("E: $@") : undef); } - sub try_cat { my ($path) = @_; open(my $fh, '<', $path) or return ''; @@ -241,7 +242,7 @@ sub cloneurl { sub base_url { my ($self, $env) = @_; # env - PSGI env - if ($env) { + if ($env && $env->{'psgi.url_scheme'}) { my $url = PublicInbox::Git::host_prefix_url($env, ''); # for mount in Plack::Builder $url .= '/' if $url !~ m!/\z!; @@ -249,7 +250,8 @@ sub base_url { } # called from a non-PSGI environment (e.g. NNTP/POP3): $self->{-base_url} ||= do { - my $url = $self->{url}->[0] or return undef; + my $url = $self->{url} // return undef; + $url = $url->[0] // return undef; # expand protocol-relative URLs to HTTPS if we're # not inside a web server $url = "https:$url" if $url =~ m!\A//!; @@ -421,4 +423,16 @@ sub uidvalidity { $_[0]->{uidvalidity} //= eval { $_[0]->mm->created_at } } sub eidx_key { $_[0]->{newsgroup} // $_[0]->{inboxdir} } +sub mailboxid { # rfc 8474, 8620, 8621 + my ($self, $imap_slice) = @_; + my $pfx = defined($imap_slice) ? $self->{newsgroup} : $self->{name}; + utf8::encode($pfx); # to octets + # RFC 8620, 1.2 recommends not starting with dash or digits + # "A good solution to these issues is to prefix every id with a single + # alphabetical character." + 'M'.join('', map { sprintf('%02x', ord) } split(//, $pfx)) . + (defined($imap_slice) ? sprintf('-%x', $imap_slice) : '') . + sprintf('-%x', uidvalidity($self) // 0) +} + 1;