Net-QUIC
view release on metacpan or search on metacpan
use strict;
use warnings;
use FindBin ();
use Socket qw(inet_aton pack_sockaddr_in);
use Test2::V0;
use Time::HiRes qw(sleep);
use Net::QUIC::Endpoint;
my $cert_file = "$FindBin::Bin/data/server-cert.pem";
my $key_file = "$FindBin::Bin/data/server-key.pem";
my $alpn = 'net-quic-ecn-test';
sub make_pair {
my ($client_port, $server_port) = @_;
my $client_local = pack_sockaddr_in(
$client_port,
inet_aton('127.0.0.1'),
);
my $server_local = pack_sockaddr_in(
$server_port,
inet_aton('127.0.0.1'),
);
my $server = Net::QUIC::Endpoint->server(
alpn => $alpn,
certificate_file => $cert_file,
private_key_file => $key_file,
);
my $client = Net::QUIC::Endpoint->client(
local => $client_local,
peer => $server_local,
alpn => $alpn,
server_name => 'localhost',
ca_file => $cert_file,
);
return ($client, $server);
}
sub pump {
my ($client, $server, %args) = @_;
my $progress = 0;
my $accepted = $args{accepted};
my $client_marks = $args{client_marks};
my $server_marks = $args{server_marks};
my $strip = $args{strip} ? 1 : 0;
while (my $datagram = $server->next_datagram) {
++$progress;
push @$server_marks, $datagram->ecn if $server_marks;
$client->receive_datagram(
$datagram->data,
$datagram->peer,
$datagram->local,
$strip ? 0 : $datagram->ecn,
);
}
while (my $datagram = $client->next_datagram) {
++$progress;
push @$client_marks, $datagram->ecn if $client_marks;
$server->receive_datagram(
$datagram->data,
$datagram->peer,
$datagram->local,
$strip ? 0 : $datagram->ecn,
);
}
$$accepted ||= $server->next_connection if $accepted;
my @wait;
my $client_after = $client->timeout_after;
if (defined($client_after) && $client_after <= 0) {
++$progress;
$client->handle_timeout;
} elsif (defined($client_after) && $client_after > 0) {
push @wait, $client_after;
}
my $server_after = $server->timeout_after;
if (defined($server_after) && $server_after <= 0) {
++$progress;
( run in 0.657 second using v1.01-cache-2.11-cpan-036bef1c656 )