Fix 5.80 bug which causes slurp to fail if called multiple times
Tomas Doran [Tue, 15 Feb 2011 16:10:03 +0000 (16:10 +0000)]
Changes
lib/Catalyst/Request/Upload.pm
t/lib/TestApp/Controller/Engine/Request/Uploads.pm

diff --git a/Changes b/Changes
index 7ed6fb8..e413fdc 100644 (file)
--- a/Changes
+++ b/Changes
@@ -7,6 +7,10 @@ Bug fixes:
     returning true.
     Having a response body is indicated by $c->res->body being defined.
 
+  - Fix bug with calling $upload->slurp multiple times in one request
+    not working as expected as the file handle wasn't returned to
+    the zero position. (Adam Sjøgren)
+
 5.80031 2011-01-31 08:13:02
 
  Bug fixes:
index aee3625..1675531 100644 (file)
@@ -5,7 +5,7 @@ with 'MooseX::Emulate::Class::Accessor::Fast';
 
 use Catalyst::Exception;
 use File::Copy ();
-use IO::File   ();
+use IO::File   qw( SEEK_SET );
 use File::Spec::Unix;
 
 has filename => (is => 'rw');
@@ -128,6 +128,10 @@ Returns the size of the uploaded file in bytes.
 
 Returns a scalar containing the contents of the temporary file.
 
+Note that this method will cause the filehandle pointed to by
+C<< $upload->fh >> to be seeked to the start of the file,
+and the file handle to be put into binary mode.
+
 =cut
 
 sub slurp {
@@ -142,10 +146,12 @@ sub slurp {
 
     binmode( $handle, $layer );
 
+    $handle->seek(0, SEEK_SET);
     while ( $handle->sysread( my $buffer, 8192 ) ) {
         $content .= $buffer;
     }
 
+    $handle->seek(0, SEEK_SET);
     return $content;
 }
 
index f51df9d..37124cd 100644 (file)
@@ -6,6 +6,10 @@ use base 'Catalyst::Controller';
 sub slurp : Relative {
     my ( $self, $c ) = @_;
     $c->response->content_type('text/plain; charset=utf-8');
+    my $upload = $c->request->upload('slurp');
+    my $contents = $upload->slurp;
+    my $contents2 = $upload->slurp;
+    die("Slurp not callable multiple times") unless $contents eq $contents2;
     $c->response->output( $c->request->upload('slurp')->slurp );
 }