File Coverage

blib/lib/IO/Socket/ByteCounter.pm
Criterion Covered Total %
statement 53 56 94.6
branch 5 14 35.7
condition n/a
subroutine 13 13 100.0
pod 1 4 25.0
total 72 87 82.7


line stmt bran cond sub pod time code
1             package IO::Socket::ByteCounter;
2              
3 2     2   112304 use base 'IO::Socket';
  2         4  
  2         1036  
4              
5 2     2   35246 use strict;
  2         4  
  2         32  
6 2     2   8 use warnings;
  2         4  
  2         260  
7              
8             our $VERSION = 0.3;
9              
10             sub import {
11 2 50   2   28 shift->record_bytes(@_) if @_;
12             }
13              
14             sub record_bytes {
15 4     4 1 192 my ( $self, @pkgs ) = @_;
16              
17 4         10 for my $pkg (@pkgs) {
18 2 50       8 $pkg = ref $pkg if ref $pkg;
19              
20 2         4 my $inc = $pkg;
21 2         8 $inc =~ s{::}{/}g;
22 2 50       12 if ( !exists $INC{ $inc . '.pm' } ) {
23 0         0 eval "use $pkg;";
24 0 0       0 warn $@ if $@;
25 0 0       0 next if $@;
26             }
27              
28 2     2   12 no strict;
  2         2  
  2         252  
29 2 50       4 next if ${"$pkg\::io_socket_bytecounter_on"};
  2         14  
30              
31 2     2 0 12 eval <<"OVERRIDE_END";
  2     2 0 4  
  2     1 0 510  
  2     1   148  
  2     1   1121  
  2         5  
  2         27  
  2         48  
  2         1145  
  2         18  
  2         69  
  2         18  
  1         2  
  1         2  
  1         13  
  1         125  
  1         3  
  1         21  
  1         3  
  1         2  
  1         3  
  1         12  
32             \$$pkg\::io_socket_bytecounter_on = 1;
33             no warnings "redefine";
34              
35             #### IO::Socket methods ##
36             # IO::Socket::send
37             my \$send = \\&$pkg\::send;
38             \*$pkg\::send = sub {
39             my \$self = \$_[0];
40             \${\*\$self}{'io_socket_bytecounter_out'} += IO::Socket::ByteCounter->_get_byte_size(\$_[1]);
41             \$send->(\@_);
42             };
43              
44             # IO::Socket::recv
45             my \$recv = \\&$pkg\::recv;
46             \*$pkg\::recv = sub {
47             my \$self = \$_[0];
48             \${\*\$self}{'io_socket_bytecounter_in'} += \$_[2];
49             \$recv->(\@_);
50             };
51              
52             #### IO::Handle methods ##
53              
54              
55             #### new methods ##
56              
57             sub $pkg\::get_bytes_in {
58             my \$self = \$_[0];
59             \${\*\$self}{'io_socket_bytecounter_in'};
60             }
61              
62             sub $pkg\::get_bytes_out {
63             my \$self = \$_[0];
64             \${\*\$self}{'io_socket_bytecounter_out'};
65             }
66              
67             sub $pkg\::get_bytes_total {
68             my \$self = \$_[0];
69             \${\*\$self}{'io_socket_bytecounter_in'} + \${\*\$self}{'io_socket_bytecounter_out'};
70             }
71              
72             OVERRIDE_END
73             }
74              
75 4 50       40 return $@ ? 0 : 1;
76             }
77              
78             sub _get_byte_size {
79 2     2   85 my ( $self, @strings ) = @_;
80 2         10 my $bytes = 0;
81              
82             {
83 2     2   1062 use bytes;
  2         26  
  2         8  
  2         7  
84 2         15 for my $string (@strings) {
85 2         72 $bytes += length($string);
86             }
87             }
88              
89 2         63 return $bytes;
90             }
91              
92             1;
93              
94             __END__