NAME
    `Net::Async::HTTP::Server' - serve HTTP with `IO::Async'

SYNOPSIS
     use Net::Async::HTTP::Server;
     use IO::Async::Loop;

     use HTTP::Response;

     my $loop = IO::Async::Loop->new();

     my $httpserver = Net::Async::HTTP::Server->new(
        on_request => sub {
           my $self = shift;
           my ( $req, $token ) = @_;

           my $response = HTTP::Response->new( 200 );
           $response->add_content( "Hello, world!\n" );
           $response->content_type( "text/plain" );

           $self->respond( $token, $response );
        },
     );

     $loop->add( $httpserver );

     $httpserver->listen(
        addr => { family => "inet6", socktype => "stream", port => 8080 },
        on_listen_error => sub { die "Cannot listen - $_[-1]\n" },
     );

     $loop->run;

DESCRIPTION
    This module allows a program to respond asynchronously to HTTP requests,
    as part of a program based on IO::Async. An object in this class listens
    on a single port and invokes the `on_request' callback or subclass
    method whenever an HTTP request is received, allowing the program to
    respond to it.

EVENTS
  on_request $req, $token
    Invoked when a new HTTP request is received. It will be passed an
    HTTP::Request object and an opaque token used to respond. This token
    should be passed to the `respond' method.

METHODS
  $server->respond( $token, $response )
    Respond to the request earlier received with the given token, using the
    given HTTP::Response object.

TODO
    * Streaming/chunked content response API. Likely

       $self->respond_header( $token, $response );
       $self->respond_chunk( $token, $content ); ...
       $self->respond_eof( $token );

    * Consider how to do streaming request inbound

    * PSGI app container

    * Lots more testing

AUTHOR
    Paul Evans <leonerd@leonerd.org.uk>

