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;
+}
+
+
+
+
+