diff options
author | Eric Wong <e@80x24.org> | 2022-05-05 10:52:15 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2022-05-05 10:52:35 +0000 |
commit | 93a7b219d58aad86438cbf3cbf4318a889831ac1 (patch) | |
tree | 892d17d602370be3b2c8bc6a36d46693682915bf /lib/PublicInbox/HTTPD.pm | |
parent | 71eb48442e0f5403e9a5c3f0ccf8257600efe392 (diff) | |
download | public-inbox-93a7b219d58aad86438cbf3cbf4318a889831ac1.tar.gz |
Since we'll be adding POP3 support as our 4th network protocol; asking admins to run yet another daemon on top of existing -httpd, -nntpd, -imapd is a maintenance burden and a waste of memory. The goal of public-inbox-netd is to be able to replace all existing read-only daemons with a single process to save memory and reduce administrative overhead; hopefully encouraging more users to self-host their own mirrors. It's barely-tested at the moment. Eventually, multiple PI_CONFIG and HOME directories will be supported, as are per-listener .psgi config files.
Diffstat (limited to 'lib/PublicInbox/HTTPD.pm')
-rw-r--r-- | lib/PublicInbox/HTTPD.pm | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/lib/PublicInbox/HTTPD.pm b/lib/PublicInbox/HTTPD.pm index 02f424c6..715e4538 100644 --- a/lib/PublicInbox/HTTPD.pm +++ b/lib/PublicInbox/HTTPD.pm @@ -1,14 +1,15 @@ -# Copyright (C) 2016-2021 all contributors <meta@public-inbox.org> +# Copyright (C) all contributors <meta@public-inbox.org> # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> # wraps a listen socket for HTTP and links it to the PSGI app in # public-inbox-httpd package PublicInbox::HTTPD; +use v5.10.1; use strict; -use warnings; -use Plack::Util; +use Plack::Util (); +use Plack::Builder; +use PublicInbox::HTTP; use PublicInbox::HTTPD::Async; -use PublicInbox::Daemon; sub pi_httpd_async { PublicInbox::HTTPD::Async->new(@_) } @@ -41,10 +42,41 @@ sub new { # detect when to use async paths for slow blobs 'pi-httpd.async' => \&pi_httpd_async ); - bless { - app => $app, - env => \%env - }, $class; + bless { app => $app, env => \%env }, $class; +} + +my %httpds; # per-listen-FD mapping for HTTPD->{env}->{SERVER_<NAME|PORT>} +my $default_app; # ugh... + +sub refresh { + if (@main::ARGV) { + eval { $default_app = Plack::Util::load_psgi(@ARGV) }; + if ($@) { + die $@, +"$0 runs in /, command-line paths must be absolute\n"; + } + } else { + require PublicInbox::WWW; + my $www = PublicInbox::WWW->new; + $www->preload; + $default_app = builder { + eval { enable 'ReverseProxy' }; + $@ and warn <<EOM; +Plack::Middleware::ReverseProxy missing, +URL generation for redirects may be wrong if behind a reverse proxy +EOM + enable 'Head'; + sub { $www->call(@_) }; + }; + } + %httpds = (); # invalidate cache +} + +sub post_accept { # Listener->{post_accept} + my ($client, $addr, $srv) = @_; # $_[3] - tls_wrap (unused) + my $httpd = $httpds{fileno($srv)} //= + __PACKAGE__->new($srv, $default_app, $client); + PublicInbox::HTTP->new($client, $addr, $httpd), } 1; |