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]
  
  
  

Reply via email to