File Coverage

blib/lib/WWW/Form/UrlEncoded/PP.pm
Criterion Covered Total %
statement 67 67 100.0
branch 32 34 94.1
condition 14 18 77.7
subroutine 9 9 100.0
pod 0 5 0.0
total 122 133 91.7


line stmt bran cond sub pod time code
1             package WWW::Form::UrlEncoded::PP;
2              
3 7     7   196848 use strict;
  7         43  
  7         200  
4 7     7   36 use warnings;
  7         12  
  7         194  
5 7     7   34 use base qw/Exporter/;
  7         12  
  7         7680  
6              
7             our @EXPORT_OK = qw/parse_urlencoded parse_urlencoded_arrayref build_urlencoded build_urlencoded_utf8/;
8              
9             our $DECODE = qr/%([0-9a-fA-F]{2})/;
10             our %DecodeMap;
11             our %EncodeMap;
12             for my $num ( 0 .. 255 ) {
13             my $h = sprintf "%02X", $num;
14             my $chr = chr $num;
15             $DecodeMap{ lc $h } = $chr; #%aa
16             $DecodeMap{ uc $h } = $chr; #%AA
17             $DecodeMap{ ucfirst lc $h } = $chr; #%Aa
18             $DecodeMap{ lcfirst uc $h } = $chr; #%aA
19             $EncodeMap{$chr} = '%'. uc $h;
20             }
21             $EncodeMap{" "} = '+';
22              
23             sub parse_urlencoded {
24 124     124 0 26024 my @params;
25 124 100       342 return @params unless defined $_[0];
26 120         521 for my $pair ( split( /[&;] ?/, $_[0], -1 ) ) {
27 228         389 $pair =~ y/\+/\x20/;
28 228         578 my ($key, $val) = split /=/, $pair, 2;
29 228         424 for ($key, $val) {
30 456 100       821 if ( ! defined $_ ) {
31 30         51 push @params, '';
32 30         60 next;
33             }
34 426         1127 s/$DECODE/$DecodeMap{$1}/gs;
35 426         890 push @params, $_;
36             }
37             }
38              
39 120         515 return @params;
40             }
41              
42             sub parse_urlencoded_arrayref {
43 82     82 0 53722 [parse_urlencoded(@_)];
44             }
45              
46             our $NEED_UPGRADE = 0;
47             sub build_urlencoded {
48 66 100   66 0 30757 return "" unless @_;
49 64         115 my $uri = '';
50 64         95 my $delim = '&';
51 64 100 100     339 if ( ref $_[0] && ref $_[0] eq 'ARRAY') {
    100 66        
52 16         24 my @args = @{$_[0]};
  16         47  
53 16 100       38 $delim = $_[1] if defined $_[1];
54 16 100       43 utf8::encode($delim) if $NEED_UPGRADE;
55 16         37 while ( @args ) {
56 24         43 my $k = shift @args;
57 24         35 my $v = shift @args;
58 24 100 66     71 if ( ref $v && ref $v eq 'ARRAY') {
59 6         20 $uri .= url_encode($k) . '='. url_encode($_) . $delim for @$v;
60             }
61             else {
62 18         33 $uri .= url_encode($k) . '='. url_encode($v) . $delim
63             }
64             }
65             }
66             elsif ( ref $_[0] && ref $_[0] eq 'HASH') {
67 28 100       63 $delim = $_[1] if defined $_[1];
68 28 100       73 utf8::encode($delim) if $NEED_UPGRADE;
69 28         40 while ( my ($k,$v) = each %{$_[0]} ) {
  76         260  
70 48 100 66     158 if ( ref $v && ref $v eq 'ARRAY') {
71 46         103 $uri .= url_encode($k) . '='. url_encode($_) . $delim for @$v;
72             }
73             else {
74 2         6 $uri .= url_encode($k) . '='. url_encode($v) . $delim
75             }
76             }
77             }
78             else {
79 20 100 100     73 if ( @_ > 2 && @_ % 2 ) {
80 6         12 $delim = pop @_;
81 6 50       16 utf8::encode($delim) if $NEED_UPGRADE;
82             }
83 20         47 while ( @_ ) {
84 28         42 my $k = shift @_;
85 28         46 my $v = shift @_;
86 28 100 66     67 if ( ref $v && ref $v eq 'ARRAY') {
87 2         8 $uri .= url_encode($k) . '='. url_encode($_) . $delim for @$v;
88             }
89             else {
90 26         48 $uri .= url_encode($k) . '='. url_encode($v) . $delim
91             }
92             }
93             }
94 64         152 substr($uri,-1*length($delim),length($delim),"");
95 64         209 $uri;
96             }
97              
98             sub build_urlencoded_utf8 {
99 16     16 0 37 local $NEED_UPGRADE = 1;
100 16         35 my $uri = build_urlencoded(@_);
101 16         72 $uri;
102             }
103              
104             sub url_encode {
105 388 100   388 0 774 return '' unless defined $_[0];
106 358         513 my $t = shift;
107 358 100       719 utf8::encode($t) if $NEED_UPGRADE;
108             {
109 7     7   4162 use bytes;
  7         103  
  7         36  
  358         426  
110 358         705 $t =~ s!([^A-Za-z0-9\-\._~])!
111 48 50       189 join '',@EncodeMap{exists $EncodeMap{$1} ? ($1) : (split //,$1)}
112             !gsxe;
113             }
114 358         894 return $t;
115             }
116              
117             1;
118              
119             __END__