]> Sergey Matveev's repositories - public-inbox.git/blobdiff - public-inbox-httpd
psgi: enable ReverseProxy middleware by default
[public-inbox.git] / public-inbox-httpd
index 3635c9a75e804af9b190eda13fed7cd7dab6aeb7..6109af01a62cdad79fdd11a3bdeea9652033f94d 100644 (file)
@@ -8,13 +8,9 @@ use warnings;
 use Plack::Util;
 use PublicInbox::Daemon;
 use PublicInbox::HTTP;
-use PublicInbox::WWW;
 use Plack::Request;
 use Plack::Builder;
-PublicInbox::WWW->preload;
-my $have_deflater = eval { require Plack::Middleware::Deflater; 1 };
 my %httpds;
-my $config;
 my $app;
 my $refresh = sub {
        if (@ARGV) {
@@ -24,6 +20,8 @@ my $refresh = sub {
 "$0 runs in /, command-line paths must be absolute\n";
                }
        } else {
+               require PublicInbox::WWW;
+               PublicInbox::WWW->preload;
                my $www = PublicInbox::WWW->new;
                $app = eval {
                        my $deflate_types = eval {
@@ -37,6 +35,7 @@ my $refresh = sub {
                                        enable 'Deflater',
                                                content_type => $deflate_types
                                }
+                               enable 'ReverseProxy';
                                enable 'Head';
                                sub { $www->call(@_) };
                        };
@@ -53,11 +52,40 @@ daemon_run('0.0.0.0:8080', $refresh,
        });
 
 1;
+
+package PublicInbox::HTTPD::Async;
+use strict;
+use warnings;
+use base qw(Danga::Socket);
+use fields qw(cb);
+
+sub new {
+       my ($class, $io, $cb) = @_;
+       my $self = fields::new($class);
+       $io->blocking(0);
+       $self->SUPER::new($io);
+       $self->{cb} = $cb;
+       $self->watch_read(1);
+       $self;
+}
+
+sub event_read { $_[0]->{cb}->() }
+sub event_hup { $_[0]->{cb}->() }
+sub event_err { $_[0]->{cb}->() }
+sub sysread { shift->{sock}->sysread(@_) }
+
+1;
+
 package PublicInbox::HTTPD;
 use strict;
 use warnings;
 use Plack::Util;
 
+sub pi_httpd_async {
+       my ($io, $cb) = @_;
+       PublicInbox::HTTPD::Async->new($io, $cb);
+}
+
 sub new {
        my ($class, $sock, $app) = @_;
        my $n = getsockname($sock) or die "not a socket: $sock $!\n";
@@ -85,6 +113,10 @@ sub new {
                'psgi.multiprocess' => Plack::Util::TRUE,
                'psgix.harakiri'=> Plack::Util::FALSE,
                'psgix.input.buffered' => Plack::Util::TRUE,
+               'pi-httpd.async' => do {
+                       no warnings 'once';
+                       *pi_httpd_async
+               },
        );
        bless {
                err => \*STDERR,