skeleton BUILDALL support
[catagits/Web-Simple.git] / lib / Web / Simple / ParamParser.pm
index ad14ab5..46f8533 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use warnings FATAL => 'all';
 
 sub UNPACKED_QUERY () { __PACKAGE__.'.unpacked_query' }
+sub UNPACKED_BODY () { __PACKAGE__.'.unpacked_body' }
 
 sub get_unpacked_query_from {
   return $_[0]->{+UNPACKED_QUERY} ||= do {
@@ -11,6 +12,18 @@ sub get_unpacked_query_from {
   };
 }
 
+sub get_unpacked_body_from {
+  return $_[0]->{+UNPACKED_BODY} ||= do {
+    if (($_[0]->{CONTENT_TYPE}||'') eq 'application/x-www-form-urlencoded'
+        and defined $_[0]->{CONTENT_LENGTH}) {
+      $_[0]->{'psgi.input'}->read(my $buf, $_[0]->{CONTENT_LENGTH});
+      _unpack_params($buf);
+    } else {
+      {}
+    }
+  };
+}
+
 {
   # shamelessly stolen from HTTP::Body::UrlEncoded by Christian Hansen
 
@@ -25,8 +38,9 @@ sub get_unpacked_query_from {
 
   sub _unpack_params {
     my %unpack;
+    (my $params = $_[0]) =~ s/\+/ /g;
     my ($name, $value);
-    foreach my $pair (split(/[&;](?:\s+)?/, $_[0])) {
+    foreach my $pair (split(/[&;](?:\s+)?/, $params)) {
       next unless (($name, $value) = split(/=/, $pair, 2)) == 2;
         
       s/$DECODE/$hex_chr{$1}/gs for ($name, $value);