Net-QUIC
view release on metacpan or search on metacpan
t/08-certificate-verification.t view on Meta::CPAN
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 $server_local = pack_sockaddr_in(4438, inet_aton('127.0.0.1'));
my $client_local = pack_sockaddr_in(40007, inet_aton('127.0.0.1'));
my $alpn = 'net-quic-certificate-verification-test';
my $cert_file = "$FindBin::Bin/data/server-cert.pem";
my $key_file = "$FindBin::Bin/data/server-key.pem";
like(
dies {
Net::QUIC::Endpoint->client(
local => $client_local,
peer => $server_local,
alpn => $alpn,
);
},
qr/missing required server_name argument/,
'verified client requires a server name',
);
like(
dies {
Net::QUIC::Endpoint->client(
local => $client_local,
peer => $server_local,
alpn => $alpn,
server_name => 'localhost',
ca_file => "$FindBin::Bin/data/does-not-exist.pem",
);
},
qr/unable to load client CA file/,
'bad CA file is rejected during client construction',
);
sub run_handshake {
my (%args) = @_;
my $server = Net::QUIC::Endpoint->server(
alpn => defined($args{server_alpn}) ? $args{server_alpn} : $alpn,
certificate_file => $cert_file,
private_key_file => $key_file,
);
my %client_args = (
local => $client_local,
peer => $server_local,
alpn => defined($args{client_alpn}) ? $args{client_alpn} : $alpn,
server_name => $args{server_name},
);
$client_args{ca_file} = $args{ca_file}
if defined $args{ca_file};
my $client = Net::QUIC::Endpoint->client(%client_args);
my $server_connection;
my $error;
for (1 .. 300) {
while (my $datagram = $client->next_datagram) {
my $ok = eval {
$server->receive_datagram(
$datagram->data,
$server_local,
$client_local,
);
1;
};
if (!$ok) {
$error = $@;
last;
}
}
last if defined $error;
$server_connection ||= $server->next_connection;
while (my $datagram = $server->next_datagram) {
my $ok = eval {
$client->receive_datagram(
$datagram->data,
$client_local,
$server_local,
);
1;
};
if (!$ok) {
$error = $@;
last;
}
}
last if defined $error;
return ($client, $server_connection, undef)
if $server_connection
&& $client->connection->ready
&& $server_connection->ready;
return ($client, $server_connection, undef)
if defined $client->connection->close_info
|| ($server_connection && defined $server_connection->close_info);
my $server_after = $server->timeout_after;
( run in 0.625 second using v1.01-cache-2.11-cpan-036bef1c656 )