stas 2004/06/29 15:56:17
Modified: t/api sendfile.t t/response/TestAPI sendfile.pm xs/Apache/RequestIO Apache__RequestIO.h xs/tables/current/ModPerl FunctionTable.pm . Changes Log: APR::RequestIO::sendfile() now flushes any buffered output before sending the file contents out Revision Changes Path 1.7 +35 -13 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.6 retrieving revision 1.7 diff -u -u -r1.6 -r1.7 --- sendfile.t 30 Jan 2004 00:24:44 -0000 1.6 +++ sendfile.t 29 Jun 2004 22:56:16 -0000 1.7 @@ -2,25 +2,47 @@ use warnings FATAL => 'all'; use Apache::Test; +use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catfile); -plan tests => 3; - -my $config = Apache::Test::config(); - my $url = '/TestAPI__sendfile'; -my $data = GET_BODY($url); - -ok $data; - -my $module = catfile Apache::Test::vars('serverroot'), +my $file = catfile Apache::Test::vars('serverroot'), 'response/TestAPI/sendfile.pm'; -ok length($data) == -s $module; - -$data = GET_BODY("$url?noexist.txt"); +plan tests => 5; -ok $data =~ /Not Found/; +{ + 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 $/; + my $expected = join '', $header, <$fh>, $footer; + close $fh; + + my $received = GET_BODY($url); + + t_debug($received); + ok $received && $received eq $expected; +} + +{ + 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 $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.3 +17 -2 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.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- sendfile.pm 11 Apr 2002 11:08:43 -0000 1.2 +++ sendfile.pm 29 Jun 2004 22:56:17 -0000 1.3 @@ -12,11 +12,26 @@ sub handler { my $r = shift; + $r->content_type('text/plain'); my $file = $r->args || __FILE__; - my $status = $r->sendfile($file); + # 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'; - return $status == APR::SUCCESS ? Apache::OK : Apache::NOT_FOUND; + 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; + } + + $r->print("This is a footer\n"); + + return Apache::OK; } 1; 1.48 +17 -1 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.47 retrieving revision 1.48 diff -u -u -r1.47 -r1.48 --- Apache__RequestIO.h 2 Jun 2004 21:35:58 -0000 1.47 +++ Apache__RequestIO.h 29 Jun 2004 22:56:17 -0000 1.48 @@ -308,7 +308,7 @@ } static MP_INLINE -apr_status_t mpxs_Apache__RequestRec_sendfile(request_rec *r, +apr_status_t mpxs_Apache__RequestRec_sendfile(pTHX_ request_rec *r, const char *filename, apr_off_t offset, apr_size_t len) @@ -330,6 +330,22 @@ len = finfo.size; } + /* flush any buffered modperl output */ + { + modperl_config_req_t *rcfg = modperl_config_req_get(r); + + MP_CHECK_WBUCKET_INIT("$r->rflush"); + if (rcfg->wbucket->outcnt) { + MP_TRACE_o(MP_FUNC, "flushing %d bytes [%s]", + rcfg->wbucket->outcnt, + apr_pstrmemdup(rcfg->wbucket->pool, + rcfg->wbucket->outbuf, + rcfg->wbucket->outcnt)); + MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, TRUE), + "Apache::RequestIO::sendfile"); + } + } + status = ap_send_fd(fp, r, offset, len, &nbytes); /* apr_file_close(fp); */ /* do not do this */ 1.166 +4 -0 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm Index: FunctionTable.pm =================================================================== RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v retrieving revision 1.165 retrieving revision 1.166 diff -u -u -r1.165 -r1.166 --- FunctionTable.pm 16 Jun 2004 03:55:48 -0000 1.165 +++ FunctionTable.pm 29 Jun 2004 22:56:17 -0000 1.166 @@ -6550,6 +6550,10 @@ 'name' => 'mpxs_Apache__RequestRec_sendfile', 'args' => [ { + 'type' => 'PerlInterpreter *', + 'name' => 'my_perl' + }, + { 'type' => 'request_rec *', 'name' => 'r' }, 1.393 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.392 retrieving revision 1.393 diff -u -u -r1.392 -r1.393 --- Changes 27 Jun 2004 21:26:45 -0000 1.392 +++ Changes 29 Jun 2004 22:56:17 -0000 1.393 @@ -12,6 +12,9 @@ =item 1.99_15-dev +APR::RequestIO::sendfile() now flushes any buffered output before +sending the file contents out [Stas] + Registry: remove the misleading prefix "$$: $class:" in the logged error message, since not only registry errors will get logged if $@ is set [Stas]