HTTP::Body - ignore all data beyond Content-Length. Fixes MSIE CRLF issue
Andy Grundman [Fri, 23 Mar 2007 20:56:52 +0000 (20:56 +0000)]
Changes
lib/HTTP/Body.pm
t/05urlencoded.t
t/data/urlencoded/002-content.dat [new file with mode: 0644]
t/data/urlencoded/002-headers.yml [new file with mode: 0644]
t/data/urlencoded/002-results.yml [new file with mode: 0644]

diff --git a/Changes b/Changes
index 3558455..aba31d8 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,6 +1,8 @@
 This file documents the revision history for Perl extension HTTP::Body.
 
-0.7   2007-03-23 10:00:00
+0.7
+        - Some browsers such as MSIE send extra data after the body content.  We now
+          properly ignore anything beyond Content-Length.
         - Fixed parsing an empty (zero-length) file using multipart.
           http://rt.cpan.org/NoAuth/Bug.html?id=25392
 
index ac3d87a..c6ab815 100644 (file)
@@ -109,17 +109,26 @@ length before adding self.
 
 sub add {
     my $self = shift;
+    
+    my $cl = $self->content_length;
 
     if ( defined $_[0] ) {
-        $self->{buffer} .= $_[0];
         $self->{length} += length( $_[0] );
+        
+        # Don't allow buffer data to exceed content-length
+        if ( $self->{length} > $cl ) {
+            $_[0] = substr $_[0], 0, $cl - $self->{length};
+            $self->{length} = $cl;
+        }
+        
+        $self->{buffer} .= $_[0];
     }
 
     unless ( $self->state eq 'done' ) {
         $self->spin;
     }
 
-    return ( $self->length - $self->content_length );
+    return ( $self->length - $cl );
 }
 
 =item body
index afcc020..b73c51a 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 5;
+use Test::More tests => 10;
 
 use Cwd;
 use HTTP::Body;
@@ -13,7 +13,7 @@ use YAML;
 
 my $path = catdir( getcwd(), 't', 'data', 'urlencoded' );
 
-for ( my $i = 1; $i <= 1; $i++ ) {
+for ( my $i = 1; $i <= 2; $i++ ) {
 
     my $test    = sprintf( "%.3d", $i );
     my $headers = YAML::LoadFile( catfile( $path, "$test-headers.yml" ) );
diff --git a/t/data/urlencoded/002-content.dat b/t/data/urlencoded/002-content.dat
new file mode 100644 (file)
index 0000000..dbc03df
--- /dev/null
@@ -0,0 +1 @@
+one=foo&two=bar\r
diff --git a/t/data/urlencoded/002-headers.yml b/t/data/urlencoded/002-headers.yml
new file mode 100644 (file)
index 0000000..9377827
--- /dev/null
@@ -0,0 +1,4 @@
+---
+Content-Length: 15
+Content-Type: application/x-www-form-urlencoded
+User-Agent: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'
diff --git a/t/data/urlencoded/002-results.yml b/t/data/urlencoded/002-results.yml
new file mode 100644 (file)
index 0000000..23e78de
--- /dev/null
@@ -0,0 +1,6 @@
+---
+body: ~
+param:
+  one: foo
+  two: bar
+upload: {}