From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
use_ok 'Protocol::WebSocket::Frame';
is(Protocol::WebSocket::Frame->new->max_payload_size,
65536, 'default max_payload_size');
is(Protocol::WebSocket::Frame->new(max_payload_size => 22)->max_payload_size,
22, 'override max_payload_size');
is(Protocol::WebSocket::Frame->new(max_payload_size => 0)->max_payload_size,
0, 'turn off max_payload_size');
is(
Protocol::WebSocket::Frame->new(max_payload_size => undef)
->max_payload_size,
undef,
'turn off max_payload_size'
);
subtest 'payload too large (to_bytes)' => sub {
my $frame = Protocol::WebSocket::Frame->new(buffer => 'x' x 65537);
eval { $frame->to_bytes };
like $@, qr/Payload is too big\. Send shorter messages or increase max_payload_size/;
};
subtest 'payload larger than 65536, but under max (to_bytes)' => sub {
my $frame = Protocol::WebSocket::Frame->new(
buffer => 'x' x 65537,
max_payload_size => 65537
);
eval { $frame->to_bytes };
is $@, '';
};
subtest 'turn off payload size checking (to_bytes)' => sub {
my $frame = Protocol::WebSocket::Frame->new(
buffer => 'x' x 65537,
max_payload_size => 0
);
eval { $frame->to_bytes };
is $@, '';
};
my $large_frame =
Protocol::WebSocket::Frame->new(buffer => 'x' x 65537, max_payload_size => 0);
subtest 'payload too large (next_bytes)' => sub {
my $frame = Protocol::WebSocket::Frame->new;
$frame->append($large_frame->to_bytes);
eval { $frame->next_bytes };
like $@, qr/Payload is too big\. Deny big message/;
};
subtest 'payload larger than 65536, but under max (next_bytes)' => sub {
my $frame = Protocol::WebSocket::Frame->new(max_payload_size => 65537);
$frame->append($large_frame->to_bytes);
eval { $frame->next_bytes };
is $@, '';
};
subtest 'turn off payload size checking (next_bytes)' => sub {
my $frame = Protocol::WebSocket::Frame->new(max_payload_size => 0);
$frame->append($large_frame->to_bytes);
eval { $frame->next_bytes };
is $@, '';
};
my $first_fragment = Protocol::WebSocket::Frame->new(buffer => 'x', type => 'text', fin => 0);
my $a_fragment = Protocol::WebSocket::Frame->new(buffer => 'x', type => 'continuation', fin => 0);
subtest 'maximum number or fragments exceeded' => sub {
local $Protocol::WebSocket::Frame::MAX_FRAGMENTS_AMOUNT = 42;
my $frame = Protocol::WebSocket::Frame->new();
is $frame->{max_fragments_amount}, 42;
$frame->append($first_fragment->to_bytes);
$frame->append($a_fragment->to_bytes) for ( 1 .. $frame->{max_fragments_amount} );
eval { $frame->next_bytes };
like $@, qr/Too many fragments/;
};
done_testing;