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>.
# 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:
=cut
-sub crlf {
+sub crlf () {
return "\x0d\x0a";
}
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} );
}
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
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
---
-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'
- 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:
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:
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
- 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:
- 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:
- 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:
- 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:
- 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:
- 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:
- 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:
- 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:
- 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:
- 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: