File Coverage

blib/lib/SRS/EPP/Packets.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1              
2             package SRS::EPP::Packets;
3              
4             # encapsulate the packetization part of RFC3734
5 2     2   2021 use Moose;
  0            
  0            
6             use MooseX::Method::Signatures;
7              
8             with 'MooseX::Log::Log4perl::Easy';
9              
10             has input_state =>
11             is => "rw",
12             default => "expect_length",
13             ;
14              
15             has input_buffer =>
16             is => "ro",
17             default => sub { [] },
18             ;
19              
20             use bytes;
21              
22             method input_buffer_size() {
23             my $size = 0;
24             for ( @{ $self->input_buffer } ) {
25             $size += length $_;
26             }
27             $size;
28             }
29              
30             method input_buffer_read( Int $size where { $_ > 0 } ) {
31             my $buffer = $self->input_buffer;
32             my @rv;
33             while ( $size and @$buffer ) {
34             my $chunk = shift @$buffer;
35             if ( length $chunk > $size ) {
36             push @rv, substr $chunk, 0, $size;
37             unshift @$buffer, substr $chunk, $size;
38             last;
39             }
40             else {
41             push @rv, $chunk;
42             $size -= length $chunk;
43             }
44             }
45             join "", @rv;
46             }
47              
48             has 'input_expect' =>
49             is => "rw",
50             isa => "Int",
51             default => 4,
52             ;
53              
54             has 'session' =>
55             handles => [qw(input_packet read_input input_ready yield empty_read)],
56             ;
57              
58             method input_event( Str $data? ) {
59             $self->log_trace(
60             "input event: "
61             .(defined($data)?length($data)." byte(s)":"will read")
62             );
63             if ( defined $data and $data ne "") {
64             push @{ $self->input_buffer }, $data;
65              
66             }
67              
68             my $ready = $self->input_buffer_size;
69             my $expected = $self->input_expect;
70              
71             if ( !defined $data ) {
72             $data = $self->read_input($expected - $ready);
73             $self->log_trace(
74             "input_event read ".length($data)." byte(s)"
75             );
76             if ( length($data) == 0 ) {
77             $self->empty_read;
78             }
79             else {
80             push @{ $self->input_buffer }, $data;
81             }
82             }
83              
84             my $got_chunk;
85              
86             while ( $self->input_buffer_size >= $expected ) {
87             my $data = $expected
88             ? $self->input_buffer_read($expected)
89             : "";
90             if ( $self->input_state eq "expect_length" ) {
91             $self->input_state("expect_data");
92             $self->input_expect(unpack("N", $data)-4);
93             $self->log_trace(
94             "expecting ".$self->input_expect." byte(s)"
95             );
96             }
97             else {
98             $self->log_trace(
99             "got complete packet, calling input_packet"
100             );
101             $self->input_state("expect_length");
102             $self->input_packet($data);
103             $self->input_expect(4);
104             $self->log_trace(
105             "now expecting length packet"
106             );
107             }
108             $expected = $self->input_expect;
109             $got_chunk = 1;
110             }
111              
112             if ( $self->input_ready ) {
113             $self->log_trace(
114             "done input_event, but more input ready - yielding input_event"
115             );
116             $self->yield("input_event");
117             }
118              
119             return $got_chunk;
120             }
121              
122             1;
123              
124             __END__