The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Furl::HTTP;
use IO::Socket::INET;
use Test::More;
use Test::TCP;

test_tcp(
    client => sub {
        my $port = shift;
        my (undef, $code, undef, undef, $body) = Furl::HTTP->new->request(
            method => 'GET',
            host   => '127.0.0.1',
            port   => $port,
            path   => '/',
        );
        is $code, 200, 'code';
        is $body, 'abcde', 'body';
    },
    server => sub {
        my $port = shift;
        my $listen_sock = IO::Socket::INET->new(
            Listen    => 5,
            LocalHost => '127.0.0.1',
            LocalPort => $port,
            ReuseAddr => 1,
        ) or die $!;
        local $SIG{PIPE} = 'IGNORE';
        while (1) {
            my $sock = $listen_sock->accept
                or next;
            sysread($sock, my $buf, 1048576, 0); # read request
            syswrite $sock, join(
                "\r\n",
                "HTTP/1.0 200 OK",
                "Content-Type: text/plain",
                "",
                "abcde",
            );
            close $sock;
        }
    },
);

done_testing;