From: Eric Wong <e@80x24.org> To: meta@public-inbox.org Subject: [PATCH 2/2] config: support multi-value inbox.*.*url Date: Thu, 2 Jan 2020 03:09:30 +0000 Message-ID: <20200102030930.20994-3-e@80x24.org> (raw) In-Reply-To: <20200102030930.20994-1-e@80x24.org> Since the beginning of this project, we've implicitly supported inboxes with multiple URLs by relying on the Host: header sent by the client ($env->{HTTP_HOST}). We now offer the option to explicitly configure multiple URLs for every inbox along with the ability to do a best-effort match for matching hostnames. --- lib/PublicInbox/Config.pm | 7 ++++--- lib/PublicInbox/Hval.pm | 7 +++++++ lib/PublicInbox/Inbox.pm | 2 +- lib/PublicInbox/WwwListing.pm | 4 ++-- t/config.t | 4 ++-- t/feed.t | 2 +- t/inbox.t | 4 ++-- t/nntp.t | 2 +- 8 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 8ecf549d..ffc31f83 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -362,8 +362,8 @@ sub _fill { my ($self, $pfx) = @_; my $ibx = {}; - foreach my $k (qw(inboxdir filter url newsgroup - infourl watch watchheader httpbackendmax + foreach my $k (qw(inboxdir filter newsgroup + watch watchheader httpbackendmax replyto feedmax nntpserver indexlevel)) { my $v = $self->{"$pfx.$k"}; $ibx->{$k} = $v if defined $v; @@ -383,7 +383,8 @@ sub _fill { } # TODO: more arrays, we should support multi-value for # more things to encourage decentralization - foreach my $k (qw(address altid nntpmirror coderepo hide listid)) { + foreach my $k (qw(address altid nntpmirror coderepo hide listid url + infourl)) { if (defined(my $v = $self->{"$pfx.$k"})) { $ibx->{$k} = _array($v); } diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm index 4a79439f..0a0de834 100644 --- a/lib/PublicInbox/Hval.pm +++ b/lib/PublicInbox/Hval.pm @@ -86,6 +86,13 @@ sub raw { sub prurl { my ($env, $u) = @_; + if (ref($u) eq 'ARRAY') { + my $h = $env->{HTTP_HOST} // $env->{SERVER_NAME}; + if (my @host_match = grep(/\b\Q$h\E\b/, @$u)) { + return prurl($env, $host_match[0]); + } + $u = $u->[0]; # fall through to below: + } index($u, '//') == 0 ? "$env->{'psgi.url_scheme'}:$u" : $u; } diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index f294c0d5..a3cdcbc0 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -252,7 +252,7 @@ sub base_url { } else { # either called from a non-PSGI environment (e.g. NNTP/POP3) $self->{-base_url} ||= do { - my $url = $self->{url} or return undef; + my $url = $self->{url}->[0] or return undef; # expand protocol-relative URLs to HTTPS if we're # not inside a web server $url = "https:$url" if $url =~ m!\A//!; diff --git a/lib/PublicInbox/WwwListing.pm b/lib/PublicInbox/WwwListing.pm index 1faade6c..4f076b7d 100644 --- a/lib/PublicInbox/WwwListing.pm +++ b/lib/PublicInbox/WwwListing.pm @@ -32,7 +32,7 @@ sub list_all ($$$) { sub list_match_domain_i { my ($ibx, $arg) = @_; my ($list, $hide_key, $re) = @$arg; - if (!$ibx->{-hide}->{$hide_key} && $ibx->{url} =~ $re) { + if (!$ibx->{-hide}->{$hide_key} && grep($re, @{$ibx->{url}})) { push @$list, $ibx; } } @@ -90,7 +90,7 @@ sub ibx_entry { ${\$ibx->description} if (defined(my $info_url = $ibx->{infourl})) { - $tmp .= ' ' . $info_url . "\n"; + $tmp .= ' ' . PublicInbox::Hval::prurl($env, $info_url) . "\n"; } $tmp; } diff --git a/t/config.t b/t/config.t index db3f9b2a..1ec864b4 100644 --- a/t/config.t +++ b/t/config.t @@ -27,7 +27,7 @@ my ($tmpdir, $for_destroy) = tmpdir(); 'inboxdir' => '/home/pi/meta-main.git', 'address' => [ 'meta@public-inbox.org' ], 'domain' => 'public-inbox.org', - 'url' => 'http://example.com/meta', + 'url' => [ 'http://example.com/meta' ], -primary_address => 'meta@public-inbox.org', 'name' => 'meta', feedmax => 25, @@ -48,7 +48,7 @@ my ($tmpdir, $for_destroy) = tmpdir(); 'domain' => 'public-inbox.org', 'name' => 'test', feedmax => 25, - 'url' => 'http://example.com/test', + 'url' => [ 'http://example.com/test' ], -httpbackend_limiter => undef, nntpserver => undef, }, "lookup matches expected output for test"); diff --git a/t/feed.t b/t/feed.t index 97468c73..b2a94487 100644 --- a/t/feed.t +++ b/t/feed.t @@ -29,7 +29,7 @@ my $ibx = PublicInbox::Inbox->new({ address => 'test@example', name => 'testbox', inboxdir => $git_dir, - url => 'http://example.com/test', + url => [ 'http://example.com/test' ], feedmax => 3, }); my $git = $ibx->git; diff --git a/t/inbox.t b/t/inbox.t index c9674290..a466dd13 100644 --- a/t/inbox.t +++ b/t/inbox.t @@ -4,9 +4,9 @@ use strict; use warnings; use Test::More; use_ok 'PublicInbox::Inbox'; -my $x = PublicInbox::Inbox->new({url => '//example.com/test/'}); +my $x = PublicInbox::Inbox->new({url => [ '//example.com/test/' ]}); is($x->base_url, 'https://example.com/test/', 'expanded protocol-relative'); -$x = PublicInbox::Inbox->new({url => 'http://example.com/test'}); +$x = PublicInbox::Inbox->new({url => [ 'http://example.com/test' ]}); is($x->base_url, 'http://example.com/test/', 'added trailing slash'); $x = PublicInbox::Inbox->new({}); diff --git a/t/nntp.t b/t/nntp.t index 961b3d6a..938eef38 100644 --- a/t/nntp.t +++ b/t/nntp.t @@ -104,7 +104,7 @@ use_ok 'PublicInbox::Inbox'; -primary_address => 'a@example.com', newsgroup => 'test', domain => 'example.com', - url => '//example.com/a'}); + url => [ '//example.com/a' ]}); is($ng->base_url, $u, 'URL expanded'); my $mid = 'a@b'; my $mime = Email::MIME->new("Message-ID: <$mid>\r\n\r\n");
next prev parent reply other threads:[~2020-01-02 3:09 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-02 3:09 [PATCH 0/2] support multiple "url" and "infourl" values Eric Wong 2020-01-02 3:09 ` [PATCH 1/2] wwwlisting: show configured "infourl" properly Eric Wong 2020-01-02 3:09 ` Eric Wong [this message] 2020-01-02 20:56 ` [PATCH 2/2] config: support multi-value inbox.*.*url Eric Wong
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://public-inbox.org/README * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200102030930.20994-3-e@80x24.org \ --to=e@80x24.org \ --cc=meta@public-inbox.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
user/dev discussion of public-inbox itself This inbox may be cloned and mirrored by anyone: git clone --mirror https://public-inbox.org/meta git clone --mirror http://czquwvybam4bgbro.onion/meta git clone --mirror http://hjrcffqmbrq6wope.onion/meta git clone --mirror http://ou63pmih66umazou.onion/meta # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V1 meta meta/ https://public-inbox.org/meta \ meta@public-inbox.org public-inbox-index meta Example config snippet for mirrors. Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta nntp://news.gmane.io/gmane.mail.public-inbox.general note: .onion URLs require Tor: https://www.torproject.org/ code repositories for the project(s) associated with this inbox: https://80x24.org/public-inbox.git AGPL code for this site: git clone https://public-inbox.org/public-inbox.git