X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FInbox.pm;h=96c92652a54a4e04a64f1fdee65c730ee5ea90de;hb=e358bd7a3833f8c5bf9db57d228888f9c5f3692e;hp=c07aaa9f7056509c16008ea1e301ba74e647a7d3;hpb=b8a44a8bf2356c1fc474b119b713d7e7df365a4a;p=public-inbox.git diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index c07aaa9f..96c92652 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -5,17 +5,23 @@ package PublicInbox::Inbox; use strict; use warnings; -use Scalar::Util qw(weaken); +use Scalar::Util qw(weaken isweak); use PublicInbox::Git; +use PublicInbox::MID qw(mid2path); sub new { my ($class, $opts) = @_; + my $v = $opts->{address} ||= 'public-inbox@example.com'; + my $p = $opts->{-primary_address} = ref($v) eq 'ARRAY' ? $v->[0] : $v; + $opts->{domain} = ($p =~ /\@(\S+)\z/) ? $1 : 'localhost'; bless $opts, $class; } sub weaken_all { my ($self) = @_; - weaken($self->{$_}) foreach qw(git mm search); + foreach my $f (qw(git mm search)) { + isweak($self->{$f}) or weaken($self->{$f}); + } } sub git { @@ -65,15 +71,19 @@ sub cloneurl { } sub base_url { - my ($self, $prq) = @_; # Plack::Request - if (defined $prq) { - my $url = $prq->base->as_string; - $url .= '/' if $url !~ m!/\z!; # for mount in Plack::Builder + my ($self, $env) = @_; + if ($env) { # PSGI env + my $scheme = $env->{'psgi.url_scheme'}; + my $host_port = $env->{HTTP_HOST} || + "$env->{SERVER_NAME}:$env->{SERVER_PORT}"; + my $url = "$scheme://$host_port". ($env->{SCRIPT_NAME} || '/'); + # for mount in Plack::Builder + $url .= '/' if $url !~ m!/\z!; $url .= $self->{name} . '/'; } else { # either called from a non-PSGI environment (e.g. NNTP/POP3) $self->{-base_url} ||= do { - my $url = $self->{url}; + my $url = $self->{url} or return undef; # expand protocol-relative URLs to HTTPS if we're # not inside a web server $url = "https:$url" if $url =~ m!\A//!; @@ -83,4 +93,24 @@ sub base_url { } } +sub nntp_usable { + my ($self) = @_; + my $ret = $self->mm && $self->search; + $self->{mm} = $self->{search} = undef; + $ret; +} + +sub msg_by_path ($$;$) { + my ($self, $path, $ref) = @_; + # TODO: allow other refs: + my $str = git($self)->cat_file('HEAD:'.$path, $ref); + $$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str; + $str; +} + +sub msg_by_mid ($$;$) { + my ($self, $mid, $ref) = @_; + msg_by_path($self, mid2path($mid), $ref); +} + 1;