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   40399 use strict;
  7         7  
  7         153  
4 7     7   21 use warnings;
  7         9  
  7         153  
5 7     7   19 use base qw/Exporter/;
  7         7  
  7         5037  
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 13192 my @params;
25 124 100       271 return @params unless defined $_[0];
26 120         398 for my $pair ( split( /[&;] ?/, $_[0], -1 ) ) {
27 228         210 $pair =~ y/\+/\x20/;
28 228         380 my ($key, $val) = split /=/, $pair, 2;
29 228         263 for ($key, $val) {
30 456 100       538 if ( ! defined $_ ) {
31 30         28 push @params, '';
32 30         37 next;
33             }
34 426         738 s/$DECODE/$DecodeMap{$1}/gs;
35 426         511 push @params, $_;
36             }
37             }
38              
39 120         370 return @params;
40             }
41              
42             sub parse_urlencoded_arrayref {
43 82     82 0 28580 [parse_urlencoded(@_)];
44             }
45              
46             our $NEED_UPGRADE = 0;
47             sub build_urlencoded {
48 66 100   66 0 16993 return "" unless @_;
49 64         70 my $uri = '';
50 64         54 my $delim = '&';
51 64 100 100     330 if ( ref $_[0] && ref $_[0] eq 'ARRAY') {
    100 66        
52 16         15 my @args = @{$_[0]};
  16         32  
53 16 100       29 $delim = $_[1] if defined $_[1];
54 16 100       33 utf8::encode($delim) if $NEED_UPGRADE;
55 16         26 while ( @args ) {
56 24         24 my $k = shift @args;
57 24         21 my $v = shift @args;
58 24 100 66     57 if ( ref $v && ref $v eq 'ARRAY') {
59 6         13 $uri .= url_encode($k) . '='. url_encode($_) . $delim for @$v;
60             }
61             else {
62 18         21 $uri .= url_encode($k) . '='. url_encode($v) . $delim
63             }
64             }
65             }
66             elsif ( ref $_[0] && ref $_[0] eq 'HASH') {
67 28 100       42 $delim = $_[1] if defined $_[1];
68 28 100       46 utf8::encode($delim) if $NEED_UPGRADE;
69 28         21 while ( my ($k,$v) = each %{$_[0]} ) {
  76         193  
70 48 100 66     137 if ( ref $v && ref $v eq 'ARRAY') {
71 46         82 $uri .= url_encode($k) . '='. url_encode($_) . $delim for @$v;
72             }
73             else {
74 2         12 $uri .= url_encode($k) . '='. url_encode($v) . $delim
75             }
76             }
77             }
78             else {
79 20 100 100     59 if ( @_ > 2 && @_ % 2 ) {
80 6         8 $delim = pop @_;
81 6 50       12 utf8::encode($delim) if $NEED_UPGRADE;
82             }
83 20         34 while ( @_ ) {
84 28         22 my $k = shift @_;
85 28         20 my $v = shift @_;
86 28 100 66     54 if ( ref $v && ref $v eq 'ARRAY') {
87 2         9 $uri .= url_encode($k) . '='. url_encode($_) . $delim for @$v;
88             }
89             else {
90 26         30 $uri .= url_encode($k) . '='. url_encode($v) . $delim
91             }
92             }
93             }
94 64         112 substr($uri,-1*length($delim),length($delim),"");
95 64         220 $uri;
96             }
97              
98             sub build_urlencoded_utf8 {
99 16     16 0 19 local $NEED_UPGRADE = 1;
100 16         27 my $uri = build_urlencoded(@_);
101 16         58 $uri;
102             }
103              
104             sub url_encode {
105 388 100   388 0 504 return '' unless defined $_[0];
106 358         247 my $t = shift;
107 358 100       437 utf8::encode($t) if $NEED_UPGRADE;
108             {
109 7     7   3786 use bytes;
  7         60  
  7         25  
  358         211  
110 358         407 $t =~ s!([^A-Za-z0-9\-\._~])!
111 48 50       134 join '',@EncodeMap{exists $EncodeMap{$1} ? ($1) : (split //,$1)}
112             !gsxe;
113             }
114 358         620 return $t;
115             }
116              
117             1;
118              
119             __END__