X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-httpd;h=8ba42c2f43e1d503b93480a8517db1eb7693faa9;hb=4ba430497bfb4763691b0ad8af573eb6ff420b96;hp=6109af01a62cdad79fdd11a3bdeea9652033f94d;hpb=052f26f3ada1042afa5acadbecc48b487f4e2d52;p=public-inbox.git diff --git a/script/public-inbox-httpd b/script/public-inbox-httpd index 6109af01..8ba42c2f 100755 --- a/script/public-inbox-httpd +++ b/script/public-inbox-httpd @@ -8,7 +8,7 @@ use warnings; use Plack::Util; use PublicInbox::Daemon; use PublicInbox::HTTP; -use Plack::Request; +use PublicInbox::HTTPD; use Plack::Builder; my %httpds; my $app; @@ -23,107 +23,33 @@ my $refresh = sub { require PublicInbox::WWW; PublicInbox::WWW->preload; my $www = PublicInbox::WWW->new; - $app = eval { - my $deflate_types = eval { - require Plack::Middleware::Deflater; - [ 'text/html', 'text/plain', - 'application/atom+xml' ] - }; - builder { - enable 'Chunked'; - if ($deflate_types) { - enable 'Deflater', - content_type => $deflate_types - } - enable 'ReverseProxy'; - enable 'Head'; - sub { $www->call(@_) }; + $app = builder { + eval { + enable 'Deflater', + content_type => [ qw( + text/html + text/plain + application/atom+xml + )] }; + $@ and warn +"Plack::Middleware::Deflater missing, bandwidth will be wasted\n"; + + eval { enable 'ReverseProxy' }; + $@ and warn +"Plack::Middleware::ReverseProxy missing,\n", +"URL generation for redirects may be wrong if behind a reverse proxy\n"; + + enable 'Head'; + sub { $www->call(@_) }; }; } }; -daemon_run('0.0.0.0:8080', $refresh, +PublicInbox::Daemon::run('0.0.0.0:8080', $refresh, sub ($$$) { # post_accept my ($client, $addr, $srv) = @_; my $fd = fileno($srv); my $h = $httpds{$fd} ||= PublicInbox::HTTPD->new($srv, $app); PublicInbox::HTTP->new($client, $addr, $h), }); - -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"; - my ($port, $addr); - if (length($n) >= 28) { - require Socket6; - ($port, $addr) = Socket6::unpack_sockaddr_in6($n); - } else { - ($port, $addr) = Socket::unpack_sockaddr_in($n); - } - - my %env = ( - REMOTE_HOST => '', - REMOTE_PORT => 0, - SERVER_NAME => $addr, - SERVER_PORT => $port, - SCRIPT_NAME => '', - 'psgi.version' => [ 1, 1 ], - 'psgi.errors' => \*STDERR, - 'psgi.url_scheme' => 'http', - 'psgi.nonblocking' => Plack::Util::TRUE, - 'psgi.streaming' => Plack::Util::TRUE, - 'psgi.run_once' => Plack::Util::FALSE, - 'psgi.multithread' => Plack::Util::FALSE, - '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, - out => \*STDOUT, - app => $app, - env => \%env, - }, $class; -} - -1;