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) {
"$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 {
enable 'Deflater',
content_type => $deflate_types
}
+ enable 'ReverseProxy';
enable 'Head';
sub { $www->call(@_) };
};
});
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";
'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,