HTTP::Body 0.9, patches from Ton Voon to fix empty fields on multipart/form-data... v0.9
Andy Grundman [Tue, 27 Mar 2007 18:32:30 +0000 (18:32 +0000)]
16 files changed:
Changes
META.yml
lib/HTTP/Body/MultiPart.pm
t/data/multipart/001-content.dat
t/data/multipart/001-headers.yml
t/data/multipart/001-results.yml
t/data/multipart/002-results.yml
t/data/multipart/003-results.yml
t/data/multipart/004-results.yml
t/data/multipart/005-results.yml
t/data/multipart/006-results.yml
t/data/multipart/007-results.yml
t/data/multipart/008-results.yml
t/data/multipart/009-results.yml
t/data/multipart/010-results.yml
t/data/multipart/011-results.yml

diff --git a/Changes b/Changes
index 2bc8eff..9497e8e 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,18 +1,23 @@
 This file documents the revision history for Perl extension HTTP::Body.
 
-0.9
-        - Small performance tweaks to urlencoded parser.
+0.9   2007-03-27 14:00:00
+        - Fixed bug where empty fields in multipart/form-data were ignored.
+          (Ton Voon)
+        - Fixed bug where an uploaded file with the name "0" was ignored.
+          (Ton Voon)
+        - Small performance improvements to urlencoded parser.
 
 0.8   2007-03-23 18:40:00
-        - Some browsers such as MSIE send extra data after the body content.  We now
-          properly ignore anything beyond Content-Length.
+        - Some browsers such as MSIE send extra data after the body content.
+          We now properly ignore anything beyond Content-Length.
 
 0.7   2007-03-23 10:00:00
         - Fixed parsing an empty (zero-length) file using multipart.
           http://rt.cpan.org/NoAuth/Bug.html?id=25392
 
 0.6   2006-01-06 00:00:00
-        - Fixed buffer bug in OctetStream, reported by Daisuke Murase <typester@cpan.org>.
+        - Fixed buffer bug in OctetStream, reported by Daisuke Murase
+          <typester@cpan.org>.
         - Fixed YAML prereq, reported by Jess Robinson
         - Added tests, Ben Trott <ben@sixapart.com>.
 
index 89efaf4..ba53ae4 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -1,7 +1,7 @@
 # http://module-build.sourceforge.net/META-spec.html
 #XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
 name:         HTTP-Body
-version:      0.8
+version:      0.9
 version_from: lib/HTTP/Body.pm
 installdirs:  site
 requires:
index 83aa9df..b5860f1 100644 (file)
@@ -89,7 +89,7 @@ sub boundary_end {
 
 =cut
 
-sub crlf {
+sub crlf () {
     return "\x0d\x0a";
 }
 
@@ -257,45 +257,42 @@ sub parse_body {
 sub handler {
     my ( $self, $part ) = @_;
 
-    my $disposition = $part->{headers}->{'Content-Disposition'};
-    my ($name)     = $disposition =~ / name="?([^\";]+)"?/;
-    my ($filename) = $disposition =~ / filename="?([^\"]+)"?/;
-
-    # skip parts without content
-    if ( $part->{done} && $part->{size} == 0 && !$filename) {
-        return 0;
-    }
-
     unless ( exists $part->{name} ) {
 
+        my $disposition = $part->{headers}->{'Content-Disposition'};
+        my ($name)      = $disposition =~ / name="?([^\";]+)"?/;
+        my ($filename)  = $disposition =~ / filename="?([^\"]*)"?/;
+        # Need to match empty filenames above, so this part is flagged as an upload type
 
-        $part->{name}     = $name;
-        $part->{filename} = $filename;
+        $part->{name} = $name;
 
-        if ($filename) {
+        if ( defined $filename ) {
+            $part->{filename} = $filename;
 
-            my $fh = File::Temp->new( UNLINK => 0 );
+            if ( $filename ne "" ) {
+                my $fh = File::Temp->new( UNLINK => 0 );
 
-            $part->{fh}       = $fh;
-            $part->{tempname} = $fh->filename;
+                $part->{fh}       = $fh;
+                $part->{tempname} = $fh->filename;
+               }
         }
     }
 
-    if ( $part->{filename} && ( my $length = length( $part->{data} ) ) ) {
+    if ( $part->{fh} && ( my $length = length( $part->{data} ) ) ) {
         $part->{fh}->write( substr( $part->{data}, 0, $length, '' ), $length );
     }
 
     if ( $part->{done} ) {
 
-        if ( $part->{filename} ) {
+        if ( exists $part->{filename} ) {
+               if ( $part->{filename} ne "" ) {
+                $part->{fh}->close;
 
-            $part->{fh}->close;
+                delete @{$part}{qw[ data done fh ]};
 
-            delete @{$part}{qw[ data done fh ]};
-
-            $self->upload( $part->{name}, $part );
+                $self->upload( $part->{name}, $part );
+            }
         }
-
         else {
             $self->param( $part->{name}, $part->{data} );
         }
index cd96556..50e5885 100644 (file)
@@ -24,25 +24,25 @@ Molestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem
 Content-Disposition: form-data; name="upload"; filename="hello.pl"\r
 Content-Type: application/octet-stream\r
 \r
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-print "Hello World :)\n";
-
+#!/usr/bin/perl\r
+\r
+use strict;\r
+use warnings;\r
+\r
+print "Hello World :)\n";\r
+\r
 \r
 ------------0xKhTmLbOuNdArY\r
 Content-Disposition: form-data; name="upload"; filename="hello.pl"\r
 Content-Type: application/octet-stream\r
 \r
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-print "Hello World :)\n";
-
+#!/usr/bin/perl\r
+\r
+use strict;\r
+use warnings;\r
+\r
+print "Hello World :)\n";\r
+\r
 \r
 ------------0xKhTmLbOuNdArY\r
 Content-Disposition: form-data; name="upload1"; filename=""\r
@@ -52,17 +52,21 @@ Content-Disposition: form-data; name="upload1"; filename=""
 Content-Disposition: form-data; name="upload2"; filename="hello.pl"\r
 Content-Type: application/octet-stream\r
 \r
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-print "Hello World :)\n";
-
+#!/usr/bin/perl\r
+\r
+use strict;\r
+use warnings;\r
+\r
+print "Hello World :)\n";\r
+\r
 \r
 ------------0xKhTmLbOuNdArY\r
 Content-Disposition: form-data; name="upload3"; filename="blank.pl"\r
 Content-Type: application/octet-stream\r
 \r
 \r
+------------0xKhTmLbOuNdArY\r
+Content-Disposition: form-data; name="upload4"; filename="0"\r
+\r
+\r
 ------------0xKhTmLbOuNdArY--\r
index e7cac31..15c1382 100644 (file)
@@ -1,4 +1,4 @@
 ---
-Content-Length: 1701
+Content-Length: 1817
 Content-Type: multipart/form-data; boundary=----------0xKhTmLbOuNdArY
 User-Agent: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312'
index f7f3ee8..7641e40 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
@@ -13,20 +14,20 @@ upload:
         Content-Disposition: form-data; name="upload"; filename="hello.pl"
         Content-Type: application/octet-stream
       name: upload
-      size: 71
+      size: 78
     - filename: hello.pl
       headers:
         Content-Disposition: form-data; name="upload"; filename="hello.pl"
         Content-Type: application/octet-stream
       name: upload
-      size: 71
+      size: 78
   upload2:
     filename: hello.pl
     headers:
       Content-Disposition: form-data; name="upload2"; filename="hello.pl"
       Content-Type: application/octet-stream
     name: upload2
-    size: 71
+    size: 78
   upload3:
     filename: blank.pl
     headers:
@@ -34,3 +35,9 @@ upload:
       Content-Type: application/octet-stream
     name: upload3
     size: 0
+  upload4:
+    filename: 0
+    headers:
+      Content-Disposition: form-data; name="upload4"; filename="0"
+    name: upload4
+    size: 0
index 580d006..d2e1e3b 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa.\r\n"
 upload:
   upload:
index 09c0c57..31e6817 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\n\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index bd2e318..642bfb0 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index 701fe33..b4063a6 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index bd39105..0331f73 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index bd2e318..642bfb0 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index bd39105..0331f73 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index 33d5ecd..32f5af1 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index 8e8552c..28c5f03 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload:
index 8e8552c..28c5f03 100644 (file)
@@ -5,6 +5,7 @@ param:
     - A
     - B
   text1: Ratione accusamus aspernatur aliquam
+  text2: ""
   textarea: "Voluptatem cumque voluptate sit recusandae at. Et quas facere rerum unde esse. Sit est et voluptatem. Vel temporibus velit neque odio non.\r\n\r\nMolestias rerum ut sapiente facere repellendus illo. Eum nulla quis aut. Quidem voluptas vitae ipsam officia voluptatibus eveniet. Aspernatur cupiditate ratione aliquam quidem corrupti. Eos sunt rerum non optio culpa."
 upload:
   upload: