The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
# vim: ts=2 sw=2 filetype=perl expandtab

use warnings;
use strict;

BEGIN {
  unless (-f 'run_network_tests') {
    print "1..0 # skip - Network access (and permission) required to run this test\n";
    exit;
  }
  eval "use HTTP::Request";
  if ($@) {
    print "1..0 # skip - HTTP::Request needed to test POE::Filter::HTTPD\n";
    exit;
  }
}

use Test::More tests => 2;

my $port;

use POE qw(
  Component::Client::TCP
  Component::Server::TCP
  Filter::HTTPD
);

#
# handler
#

POE::Component::Server::TCP->new(
  Alias        => 's0',
  Port         => 0,
  Address      => '127.0.0.1',
  ClientFilter => 'POE::Filter::HTTPD',
  Started => sub {
    use Socket qw(sockaddr_in);
    $port = (
      sockaddr_in($_[HEAP]->{listener}->getsockname())
    )[0];
  },

  ClientInput => sub {
    my ( $kernel, $heap, $request ) = @_[ KERNEL, HEAP, ARG0 ];
    isa_ok( $request, 'HTTP::Message', $request);
  },
);

POE::Component::Client::TCP->new (
  Alias => 'c0',
  RemoteAddress => '127.0.0.1',
  RemotePort => $port,
  ServerInput => sub {
    diag("Server Input: $_[ARG0]");
  }
);

POE::Component::Client::TCP->new (
  Alias => 'c1',
  RemoteAddress => '127.0.0.1',
  RemotePort => $port,
  Connected => sub {
    ok 1, 'client connected';
    $_[HEAP]->{server}->put( "GET / 1.0\015\012\015\012");
  },
  ServerInput => sub {
    ok 1, "client got $_[ARG0]";
  }
);

POE::Session->create(
  inline_states => {
    _start => sub {
      $_[KERNEL]->delay_add( done => 3 );
    },
    done => sub {
      $_[KERNEL]->post( $_ => 'shutdown' )
        for qw/ s0 c0 c1 /;
    }
  }
);

$poe_kernel->run();
exit 0;