-
-1;
-
-# XXX This is a totally unstable API for public-inbox internal use only
-# This is exposed via the 'pi-httpd.async' key in the PSGI env hash.
-# The name of this key is not even stable!
-# Currently is is intended for use with read-only pipes.
-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::Handle::blocking($io, 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;