stas 2004/07/01 14:19:19
Modified: . Changes
t/api sendfile.t
t/response/TestAPI sendfile.pm
xs/Apache/RequestIO Apache__RequestIO.h
Log:
- fix a bug when offset is passed, but not len
- add tests for offset and offset+len
- restructure the test
Revision Changes Path
1.396 +1 -1 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.395
retrieving revision 1.396
diff -u -u -r1.395 -r1.396
--- Changes 1 Jul 2004 20:25:25 -0000 1.395
+++ Changes 1 Jul 2004 21:19:18 -0000 1.396
@@ -21,7 +21,7 @@
APR::RequestIO::sendfile() now flushes any buffered output before
sending the file contents out. If the return status is not checked and
-an error happens it'll throw an exception. [Stas]
+an error happens it'll throw an exception. Fix offset handling. [Stas]
Registry: remove the misleading prefix "$$: $class:" in the logged
error message, since not only registry errors will get logged if $@ is
1.10 +29 -26 modperl-2.0/t/api/sendfile.t
Index: sendfile.t
===================================================================
RCS file: /home/cvs/modperl-2.0/t/api/sendfile.t,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -u -r1.9 -r1.10
--- sendfile.t 1 Jul 2004 20:25:25 -0000 1.9
+++ sendfile.t 1 Jul 2004 21:19:19 -0000 1.10
@@ -12,49 +12,52 @@
my $file = catfile Apache::Test::vars('serverroot'),
'response/TestAPI/sendfile.pm';
+my $contents;
+open my $fh, $file or die "can't open $file: $!";
+# need binmode on Win32 so as not to strip \r, which
+# are included when sending with sendfile().
+binmode $fh;
+{ local $/; $contents = <$fh>; }
+close $fh;
+
plan tests => 7;
{
my $header = "This is a header\n";
my $footer = "This is a footer\n";
- open my $fh, $file or die "can't open $file: $!";
- local $/;
- # need binmode on Win32 so as not to strip \r, which
- # are included when sending with sendfile().
- binmode $fh;
- my $expected = join '', $header, <$fh>, $footer;
- close $fh;
+ my $received = GET_BODY "$url?withwrapper";
+ my $expected = join '', $header, $contents, $footer;
+ #t_debug($received);
+ ok $received && $received eq $expected;
+}
- my $received = GET_BODY($url);
+{
+ my $received = GET_BODY "$url?offset";
+ my $expected = substr $contents, 3;
+ #t_debug($received);
+ ok $received && $received eq $expected;
+}
- t_debug($received);
+{
+ my $received = GET_BODY "$url?len";
+ my $expected = substr $contents, 3, 50;
+ #t_debug($received);
ok $received && $received eq $expected;
}
{
+ # rc is checked and handled by the code
my $res = GET "$url?noexist.txt";
- # 200 even though it wasn't found (since an output was sent before
- # sendfile was done)
- ok t_cmp($res->code, 200, "output already sent");
- t_debug($res->content);
+ ok t_cmp($res->code, 500, "failed sendfile");
+ #t_debug($res->content);
ok $res->content =~ /an internal error/;
}
{
+ # rc is not checked in this one, testing the exception throwing
my $res = GET "$url?noexist-n-nocheck.txt";
- # 200 even though it wasn't found (since an output was sent before
- # sendfile was done)
- ok t_cmp($res->code, 200, "output already sent");
- t_debug($res->content);
+ ok t_cmp($res->code, 500, "failed sendfile");
+ #t_debug($res->content);
ok $res->content =~ /an internal error/;
-}
-
-{
- # this time no printed output but the attempt to read a
- # non-existing file
- my $res = GET "$url?noexist-n-noheader.txt";
- ok t_cmp($res->code, 404, "");
- t_debug($res->content);
- ok $res->content =~ /$url was not found/;
}
1.5 +22 -17 modperl-2.0/t/response/TestAPI/sendfile.pm
Index: sendfile.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestAPI/sendfile.pm,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -u -r1.4 -r1.5
--- sendfile.pm 1 Jul 2004 20:25:25 -0000 1.4
+++ sendfile.pm 1 Jul 2004 21:19:19 -0000 1.5
@@ -13,29 +13,34 @@
my $r = shift;
$r->content_type('text/plain');
- my $file = $r->args || __FILE__;
+ my $args = $r->args;
- # buffer output up, so we can test that sendfile flushes any
- # buffered output before sending the file contents out
- local $|;
- $r->print("This is a header\n")
- unless $file eq 'noexist-n-noheader.txt';
-
- if ($file eq 'noexist-n-nocheck.txt') {
- eval { $r->sendfile($file) };
+ if ($args eq 'withwrapper') {
+ # buffer output up, so we can test that sendfile flushes any
+ # buffered output before sending the file contents out
+ local $|;
+ $r->print("This is a header\n");
+ $r->sendfile(__FILE__);
+ $r->print("This is a footer\n");
+ }
+ elsif ($args eq 'offset') {
+ $r->sendfile(__FILE__, 3);
+ }
+ elsif ($args eq 'len') {
+ $r->sendfile(__FILE__, 3, 50);
+ }
+ elsif ($args eq 'noexist-n-nocheck.txt') {
+ eval { $r->sendfile($args) };
return int $@;
}
else {
- my $rc = $r->sendfile($file);
- unless ($rc == APR::SUCCESS) {
- # warn APR::Error::strerror($rc);
- return $file eq 'noexist-n-noheader.txt'
- ? Apache::NOT_FOUND
- : $rc;
- }
+ my $rc = $r->sendfile($args);
+ # warn APR::Error::strerror($rc);
+ return $rc unless $rc == APR::SUCCESS;
}
- $r->print("This is a footer\n");
+ # XXX: can't quite test bogus offset and/or len, since ap_send_fd
+ # doesn't provide any error indications
return Apache::OK;
}
1.50 +3 -0 modperl-2.0/xs/Apache/RequestIO/Apache__RequestIO.h
Index: Apache__RequestIO.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/Apache/RequestIO/Apache__RequestIO.h,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -u -r1.49 -r1.50
--- Apache__RequestIO.h 1 Jul 2004 20:25:25 -0000 1.49
+++ Apache__RequestIO.h 1 Jul 2004 21:19:19 -0000 1.50
@@ -333,6 +333,9 @@
apr_finfo_t finfo;
apr_file_info_get(&finfo, APR_FINFO_NORM, fp);
len = finfo.size;
+ if (offset) {
+ len -= offset;
+ }
}
/* flush any buffered modperl output */