File Coverage

blib/lib/URI/data.pm
Criterion Covered Total %
statement 54 54 100.0
branch 26 28 92.8
condition 2 3 66.6
subroutine 8 8 100.0
pod 2 2 100.0
total 92 95 96.8


line stmt bran cond sub pod time code
1             package URI::data; # RFC 2397
2              
3 1     1   7 use strict;
  1         2  
  1         30  
4 1     1   4 use warnings;
  1         2  
  1         24  
5              
6 1     1   413 use parent 'URI';
  1         283  
  1         5  
7              
8             our $VERSION = '5.20';
9              
10 1     1   570 use MIME::Base64 qw(decode_base64 encode_base64);
  1         642  
  1         63  
11 1     1   6 use URI::Escape qw(uri_unescape);
  1         2  
  1         582  
12              
13             sub media_type
14             {
15 9     9 1 22 my $self = shift;
16 9         19 my $opaque = $self->opaque;
17 9 50       29 $opaque =~ /^([^,]*),?/ or die;
18 9         21 my $old = $1;
19 9         14 my $base64;
20 9 100       32 $base64 = $1 if $old =~ s/(;base64)$//i;
21 9 100       18 if (@_) {
22 6         11 my $new = shift;
23 6 100       13 $new = "" unless defined $new;
24 6         9 $new =~ s/%/%25/g;
25 6         10 $new =~ s/,/%2C/g;
26 6 100       12 $base64 = "" unless defined $base64;
27 6         55 $opaque =~ s/^[^,]*,?/$new$base64,/;
28 6         16 $self->opaque($opaque);
29             }
30 9 100       40 return uri_unescape($old) if $old; # media_type can't really be "0"
31 3         8 "text/plain;charset=US-ASCII"; # default type
32             }
33              
34             sub data
35             {
36 17     17 1 452 my $self = shift;
37 17         34 my($enc, $data) = split(",", $self->opaque, 2);
38 17 100       44 unless (defined $data) {
39 1         2 $data = "";
40 1 50       3 $enc = "" unless defined $enc;
41             }
42 17         38 my $base64 = ($enc =~ /;base64$/i);
43 17 100       32 if (@_) {
44 10 100       24 $enc =~ s/;base64$//i if $base64;
45 10         50 my $new = shift;
46 10 100       23 $new = "" unless defined $new;
47 10         264 my $uric_count = _uric_count($new);
48 10         21 my $urienc_len = $uric_count + (length($new) - $uric_count) * 3;
49 10         27 my $base64_len = int((length($new)+2) / 3) * 4;
50 10         12 $base64_len += 7; # because of ";base64" marker
51 10 100 66     40 if ($base64_len < $urienc_len || $_[0]) {
52 2         4 $enc .= ";base64";
53 2         18 $new = encode_base64($new, "");
54             } else {
55 8         15 $new =~ s/%/%25/g;
56             }
57 10         63 $self->opaque("$enc,$new");
58             }
59 17 100       42 return unless defined wantarray;
60 9         20 $data = uri_unescape($data);
61 9 100       56 return $base64 ? decode_base64($data) : $data;
62             }
63              
64             # I could not find a better way to interpolate the tr/// chars from
65             # a variable.
66             my $ENC = $URI::uric;
67             $ENC =~ s/%//;
68              
69 10     10   41 eval <
70             sub _uric_count
71             {
72             \$_[0] =~ tr/$ENC//;
73             }
74             EOT
75              
76             1;
77              
78             __END__