From 052f26f3ada1042afa5acadbecc48b487f4e2d52 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 27 Feb 2016 21:57:57 +0000 Subject: move executables to script/ directory This seems to match more closely with what is expected of Perl packages based on how blib is used. Hopefully makes the top-level source tree less cluttered and things easier-to-find. --- script/public-inbox-httpd | 129 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100755 script/public-inbox-httpd (limited to 'script/public-inbox-httpd') diff --git a/script/public-inbox-httpd b/script/public-inbox-httpd new file mode 100755 index 00000000..6109af01 --- /dev/null +++ b/script/public-inbox-httpd @@ -0,0 +1,129 @@ +#!/usr/bin/perl -w +# Copyright (C) 2016 all contributors +# License: AGPL-3.0+ +# +# Standalone HTTP server for public-inbox. +use strict; +use warnings; +use Plack::Util; +use PublicInbox::Daemon; +use PublicInbox::HTTP; +use Plack::Request; +use Plack::Builder; +my %httpds; +my $app; +my $refresh = sub { + if (@ARGV) { + eval { $app = Plack::Util::load_psgi(@ARGV) }; + if ($@) { + die $@, +"$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 { + 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(@_) }; + }; + }; + } +}; + +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; -- cgit v1.2.3-24-ge0c7