dougm       00/12/20 00:07:37

  Modified:    .        Changes
               Apache   Apache.pm
               src/modules/perl Apache.xs
               t/internal http-get.t
               t/net/perl/io perlio.pl
  Log:
  rewrite of Apache::WRITE() in c/xs
  
  Revision  Changes    Path
  1.556     +3 -0      modperl/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl/Changes,v
  retrieving revision 1.555
  retrieving revision 1.556
  diff -u -r1.555 -r1.556
  --- Changes   2000/12/20 07:24:42     1.555
  +++ Changes   2000/12/20 08:07:32     1.556
  @@ -10,6 +10,9 @@
   
   =item 1.24_02-dev
   
  +rewrite of Apache::WRITE() in c/xs
  +[Soheil Seyfaie <[EMAIL PROTECTED]>]
  +
   prevent $PerlRequire in a <Perl> section from triggering an endless loop
   [Salvador Ortiz Garcia <[EMAIL PROTECTED]>]
   
  
  
  
  1.60      +0 -6      modperl/Apache/Apache.pm
  
  Index: Apache.pm
  ===================================================================
  RCS file: /home/cvs/modperl/Apache/Apache.pm,v
  retrieving revision 1.59
  retrieving revision 1.60
  diff -u -r1.59 -r1.60
  --- Apache.pm 2000/11/25 15:39:24     1.59
  +++ Apache.pm 2000/12/20 08:07:34     1.60
  @@ -158,12 +158,6 @@
   }
   *printf = \&PRINTF;
   
  -sub WRITE {
  -    my($r, $buff, $length, $offset) = @_;
  -    my $send = substr($buff, $offset, $length);
  -    $r->print($send);
  -}
  -
   sub send_cgi_header {
       my($r, $headers) = @_;
       my $dlm = "\015?\012"; #a bit borrowed from LWP::UserAgent
  
  
  
  1.117     +48 -0     modperl/src/modules/perl/Apache.xs
  
  Index: Apache.xs
  ===================================================================
  RCS file: /home/cvs/modperl/src/modules/perl/Apache.xs,v
  retrieving revision 1.116
  retrieving revision 1.117
  diff -u -r1.116 -r1.117
  --- Apache.xs 2000/12/20 07:02:49     1.116
  +++ Apache.xs 2000/12/20 08:07:35     1.117
  @@ -1035,6 +1035,54 @@
       }
   
   int
  +write(r, sv_buffer, sv_length=-1, offset=0)
  +    Apache   r
  +    SV *sv_buffer
  +    int sv_length
  +    int offset
  +
  +    ALIAS:
  +    Apache::WRITE = 1
  +
  +    PREINIT:
  +    STRLEN len;
  +    char *buffer;
  +    int sent = 0;
  +
  +    CODE:
  +    ix = ix; /* avoid -Wall warning */
  +    RETVAL = 0;
  +
  +    if (r->connection->aborted) {
  +        XSRETURN_UNDEF;
  +    }
  +
  +    buffer = SvPV(sv_buffer, len);
  +    if (sv_length != -1) {
  +        len = sv_length;
  +    }
  +
  +    if (offset) {
  +        buffer += offset;
  +    }
  +
  +    while (len > 0) {
  +        sent = rwrite(buffer,
  +                      len < HUGE_STRING_LEN ? len : HUGE_STRING_LEN,
  +                      r);
  +        if (sent < 0) {
  +            rwrite_neg_trace(r);
  +         break;
  +        }
  +        buffer += sent;
  +        len -= sent;
  +        RETVAL += sent;
  +    }
  +
  +    OUTPUT:
  +    RETVAL
  +
  +int
   print(r, ...)
       Apache   r
   
  
  
  
  1.7       +25 -2     modperl/t/internal/http-get.t
  
  Index: http-get.t
  ===================================================================
  RCS file: /home/cvs/modperl/t/internal/http-get.t,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- http-get.t        2000/10/10 16:33:59     1.6
  +++ http-get.t        2000/12/20 08:07:36     1.7
  @@ -7,8 +7,10 @@
   my(@test_scripts) = qw(test perl-status);
   %get_only = map { $_,1 } qw(perl-status);
   
  +my(@sys_tests) = qw(syswrite_1 syswrite_2 syswrite_3);
  +
   if($] > 5.003) {
  -    $num_tests += 3;
  +    $num_tests += (3 + @sys_tests);
       push @test_scripts, qw(io/perlio.pl);
   }
   
  @@ -42,7 +44,28 @@
       next if $get_only{$s};
   
       test ++$i, ($str =~ /^REQUEST_METHOD=GET$/m); 
  -    test ++$i, ($str =~ /^QUERY_STRING=query$/m); 
  +    test ++$i, ($str =~ /^QUERY_STRING=query$/m);
  +
  +    if ($s eq 'io/perlio.pl') {
  +        foreach my $h (@sys_tests) {
  +            $url = new URI::URL("http://$netloc$script?$h");
  +
  +            $request = new HTTP::Request('GET', $url);
  +
  +            print "GET $url\n\n";
  +
  +            $response = $ua->request($request, undef, undef);
  +
  +            $str = $response->as_string;
  +            print "$str\n";
  +            if ($h eq 'syswrite_noheader') {
  +                test ++$i, $str =~ /(Internal Server Error)/;
  +            } else {
  +                die "$1\n" if $str =~ /(Internal Server Error)/;
  +                test ++$i, ($response->is_success);
  +            }
  +        }
  +    }
   }
   
   my $mp_version;
  
  
  
  1.6       +51 -0     modperl/t/net/perl/io/perlio.pl
  
  Index: perlio.pl
  ===================================================================
  RCS file: /home/cvs/modperl/t/net/perl/io/perlio.pl,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- perlio.pl 1999/05/18 02:08:33     1.5
  +++ perlio.pl 2000/12/20 08:07:37     1.6
  @@ -113,3 +113,54 @@
   
   }
   
  +sub test_syswrite_1 {
  +    test_syswrite();
  +}
  +
  +sub test_syswrite_2 {
  +    test_syswrite(160);
  +}
  +
  +sub test_syswrite_3 {
  +    test_syswrite(80, 2000);
  +}
  +
  +sub test_syswrite {
  +    my $len = shift;
  +    my $offset = shift;
  +    my $msg = "";
  +
  +#    my $m = "ENTERING test_syswrite ";
  +#    $m .= "LEN = $len " if $len;
  +#    $m .= "OFF = $offset" if $offset;
  +#    print STDERR $m, "\n";
  +
  +    print "Status: 200 Bottles of beer on the wall\n",
  +    "X-Perl-Version: $]\n";
  +    print "X-Perl-Script: perlio.pl\n";
  +    print "X-Message: hello\n";
  +    print "Content-type: text/plain\n\n";
  +
  +    for ('A'..'Z') {
  +     $msg .= $_ x 80;
  +    }
  +    my $bytes_sent = 
  +     defined($offset) ? syswrite STDOUT, $msg, $len, $offset :  
  +      defined($len) ? syswrite STDOUT, $msg, $len : syswrite STDOUT, $msg;
  +
  +    my $real_b = $r->bytes_sent;
  +    print "REAL Bytes sent = $real_b\n";
  +    die "Syswrite error. Bytes wrote=$bytes_sent. Real bytes sent = $real_b\n"
  +     unless $bytes_sent == $real_b;
  +}
  +
  +sub test_syswrite_noheader {
  +    print STDERR "********* This is not a real error. Ignore. *********\n";
  +    my $msg = "1234WRITEmethod";
  +    syswrite STDOUT, $msg, 5, 4;
  +}
  +
  +
  +
  +
  +
  
  
  

Reply via email to