File Coverage

blib/lib/Mail/Colander/Server/IOWrapper.pm
Criterion Covered Total %
statement 17 57 29.8
branch 0 6 0.0
condition n/a
subroutine 6 11 54.5
pod 4 4 100.0
total 27 78 34.6


line stmt bran cond sub pod time code
1             package Mail::Colander::Server::IOWrapper;
2 1     1   2265 use v5.24;
  1         2  
3 1     1   32 use Moo;
  1         2  
  1         8  
4 1     1   301 use experimental qw< signatures >;
  1         1  
  1         4  
5             { our $VERSION = '0.004' }
6              
7 1     1   1034 use English qw< -no_match_vars >;
  1         669  
  1         4  
8 1     1   260 use Ouch qw< :trytiny_var >;
  1         1  
  1         7  
9 1     1   76 use namespace::clean;
  1         1  
  1         9  
10              
11             has inr => (is => 'rw', default => sub { my $v = ''; return \$v });
12             has outr => (is => 'rw', default => sub { my $v = ''; return \$v });
13             has ofh => (is => 'lazy');
14             has size => (is => 'rw', default => 0);
15             has stream => (is => 'ro', required => 1);
16              
17 0     0     sub _build_ofh ($self) {
  0            
  0            
18 0 0         open my $ofh, '>:raw', $self->outr or ouch 500, "open(): $OS_ERROR";
19 0           bless($ofh, 'IO::Handle'); # dirty trick
20 0           return $ofh;
21             }
22              
23 0     0 1   sub read_input ($self, $bytes) {
  0            
  0            
  0            
24 0           my $inr = $self->inr;
25 0           $$inr .= $bytes;
26              
27             # FIXME we have to think harder on limiting the line lenght AND the
28             # input message size (to prevent flooding/excessively big messages)
29 0           $self->size($self->size + length($bytes));
30              
31 0           my $idx = rindex($$inr, "\x{0A}"); # like Net::Server::Mail::process()
32 0 0         return '' if $idx < 0;
33 0           return substr($$inr, 0, $idx + 1, '');
34             }
35              
36 0     0 1   sub write_output ($self) {
  0            
  0            
37 0           my $outr = $self->outr;
38 0 0         if (length($$outr)) {
39 0           $self->stream->write($$outr);
40 0           $$outr = '';
41 0           seek($self->ofh, 0, 0);
42             }
43 0           return $self;
44             }
45              
46 0     0 1   sub reset ($self) {
  0            
  0            
47 0           ${$self->inr} = '';
  0            
48 0           ${$self->outr} = '';
  0            
49 0           seek($self->ofh, 0, 0);
50 0           $self->size(0);
51 0           return $self;
52             }
53              
54 0     0 1   sub reset_size ($self) {
  0            
  0            
55 0           $self->size(0);
56 0           return $self;
57             }
58              
59             1;