e1827d13111fc6a0ae6326d1156cf2980d2e0462
[catagits/Web-Simple.git] / lib / Web / Simple / ParamParser.pm
1 package Web::Simple::ParamParser;
2
3 use strict;
4 use warnings FATAL => 'all';
5
6 sub UNPACKED_QUERY () { __PACKAGE__.'.unpacked_query' }
7
8 sub get_unpacked_query_from {
9   return $_[0]->{+UNPACKED_QUERY} ||= do {
10     _unpack_params($_[0]->{QUERY_STRING})
11   };
12 }
13
14 {
15   # shamelessly stolen from HTTP::Body::UrlEncoded by Christian Hansen
16
17   my $DECODE = qr/%([0-9a-fA-F]{2})/;
18
19   my %hex_chr;
20
21   foreach my $num ( 0 .. 255 ) {
22     my $h = sprintf "%02X", $num;
23     $hex_chr{ lc $h } = $hex_chr{ uc $h } = chr $num;
24   }
25
26   sub _unpack_params {
27     my %unpack;
28     (my $params = $_[0]) =~ s/\+/ /g;
29     my ($name, $value);
30     foreach my $pair (split(/[&;](?:\s+)?/, $params)) {
31       next unless (($name, $value) = split(/=/, $pair, 2)) == 2;
32         
33       s/$DECODE/$hex_chr{$1}/gs for ($name, $value);
34
35       push(@{$unpack{$name}||=[]}, $value);
36     }
37     \%unpack;
38   }
39 }
40
41 1;