stas 2003/12/22 19:02:34
Modified: src/modules/perl modperl_filter.c modperl_io_apache.c
xs/Apache/RequestIO Apache__RequestIO.h
xs/maps modperl_functions.map
xs/tables/current/ModPerl FunctionTable.pm
. Changes
Added: t/filter/TestFilter in_error.pm
t/filter in_error.t
Log:
fix the $r->read function to return undef on failure similar to the
core perl function and make $! available for those who test for read()
failures + test.
Revision Changes Path
1.1 modperl-2.0/t/filter/TestFilter/in_error.pm
Index: in_error.pm
===================================================================
package TestFilter::in_error;
# errors in filters should be properly propogated to httpd
# XXX: need to test output as well, and separately connection and
# request filters
use strict;
use warnings FATAL => 'all';
use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::Filter ();
use APR::Table ();
use Apache::TestTrace;
use Apache::Const -compile => qw(OK);
sub handler {
my $filter = shift;
debug join '', "-" x 20 , " filter called ", "-" x 20;
die "This filter must die";
return Apache::OK;
}
sub response {
my $r = shift;
my $len = $r->read(my $data, $r->headers_in->{'Content-Length'});
# XXX: what about $! it's incorrect now
die "failed to read POSTed data: $!" unless defined $len;
debug "read $len bytes [$data]";
$r->content_type('text/plain');
$r->print("it shouldn't be printed, because the input filter has died");
Apache::OK;
}
1;
__DATA__
SetHandler modperl
PerlModule TestFilter::in_error
PerlResponseHandler TestFilter::in_error::response
1.1 modperl-2.0/t/filter/in_error.t
Index: in_error.t
===================================================================
use strict;
use warnings FATAL => 'all';
use Apache::Test;
use Apache::TestUtil;
use Apache::TestRequest;
plan tests => 1;
my $location = '/TestFilter__in_error';
my $res = POST $location, content => 'foo';
ok t_cmp(500, $res->code, "an error in a filter should cause 500");
1.79 +5 -1 modperl-2.0/src/modules/perl/modperl_filter.c
Index: modperl_filter.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -u -r1.78 -r1.79
--- modperl_filter.c 13 Dec 2003 23:40:31 -0000 1.78
+++ modperl_filter.c 23 Dec 2003 03:02:34 -0000 1.79
@@ -452,7 +452,11 @@
av_push(args, newSViv(filter->readbytes));
}
- /* XXX filters are VOID handlers. should we ignore the status? */
+ /* while filters are VOID handlers, we need to log any errors,
+ * because most perl coders will forget to check the return errors
+ * from read() and print() calls. and if the caller is not a perl
+ * program they won't make any sense of ERRSV or $!
+ */
if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) {
status = modperl_errsv(aTHX_ status, r, s);
}
1.14 +11 -2 modperl-2.0/src/modules/perl/modperl_io_apache.c
Index: modperl_io_apache.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_io_apache.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -u -r1.13 -r1.14
--- modperl_io_apache.c 7 Nov 2003 08:58:50 -0000 1.13
+++ modperl_io_apache.c 23 Dec 2003 03:02:34 -0000 1.14
@@ -277,15 +277,24 @@
rc = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES,
APR_BLOCK_READ, len);
if (rc != APR_SUCCESS) {
+ char *error;
/* if we fail here, we want to just return and stop trying
* to read data from the client.
*/
r->connection->keepalive = AP_CONN_CLOSE;
apr_brigade_destroy(bb);
- sv_setpv(ERRSV,
+
+ if (SvTRUE(ERRSV)) {
+ STRLEN n_a;
+ error = SvPV(ERRSV, n_a);
+ }
+ else {
+ error = modperl_apr_strerror(rc);
+ }
+ sv_setpv(get_sv("!", TRUE),
(char *)apr_psprintf(r->pool,
"failed to get bucket brigade: %s",
- modperl_apr_strerror(rc)));
+ error));
return -1;
}
1.40 +7 -9 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.39
retrieving revision 1.40
diff -u -u -r1.39 -r1.40
--- Apache__RequestIO.h 6 Nov 2003 11:22:02 -0000 1.39
+++ Apache__RequestIO.h 23 Dec 2003 03:02:34 -0000 1.40
@@ -209,7 +209,7 @@
#define mpxs_Apache__RequestRec_READ(r, bufsv, len, offset) \
mpxs_Apache__RequestRec_read(aTHX_ r, bufsv, len, offset)
-static long mpxs_Apache__RequestRec_read(pTHX_ request_rec *r,
+static SV* mpxs_Apache__RequestRec_read(pTHX_ request_rec *r,
SV *bufsv, int len,
int offset)
{
@@ -220,7 +220,10 @@
}
if (len <= 0) {
- return 0;
+ sv_setpv(get_sv("!", TRUE),
+ (char *)apr_psprintf(r->pool,
+ "The LENGTH argument can't be negative"));
+ return &PL_sv_undef;
}
/* XXX: need to handle negative offset */
@@ -237,15 +240,10 @@
sv_setpvn(bufsv, "", 0);
}
else {
- /* need to return undef according to the read entry, but at
- * the moment we return IV, so need to change to return SV,
- * meanwhile just crock */
- if (SvTRUE(ERRSV)) {
- (void)modperl_errsv(aTHX_ HTTP_INTERNAL_SERVER_ERROR, r, NULL);
- }
+ return &PL_sv_undef;
}
- return total;
+ return sv_2mortal(newSViv(total));
}
static MP_INLINE
1.63 +1 -1 modperl-2.0/xs/maps/modperl_functions.map
Index: modperl_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/modperl_functions.map,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -u -r1.62 -r1.63
--- modperl_functions.map 18 Dec 2003 18:53:50 -0000 1.62
+++ modperl_functions.map 23 Dec 2003 03:02:34 -0000 1.63
@@ -48,7 +48,7 @@
SV *:DEFINE_UNTIE | | request_rec *:r, int:refcnt
mpxs_Apache__RequestRec_sendfile | | r, filename=r->filename, offset=0, len=0
mpxs_Apache__RequestRec_read | | r, bufsv, len, offset=0
- long:DEFINE_READ | | request_rec *:r, SV *:bufsv, int:len, int:offset=0
+ SV *:DEFINE_READ | | request_rec *:r, SV *:bufsv, int:len, int:offset=0
mpxs_Apache__RequestRec_write | | r, buffer, bufsiz=-1, offset=0
mpxs_Apache__RequestRec_print | | ...
apr_ssize_t:DEFINE_WRITE | | \
1.134 +1 -1 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.133
retrieving revision 1.134
diff -u -u -r1.133 -r1.134
--- FunctionTable.pm 8 Dec 2003 19:31:53 -0000 1.133
+++ FunctionTable.pm 23 Dec 2003 03:02:34 -0000 1.134
@@ -5748,7 +5748,7 @@
]
},
{
- 'return_type' => 'long',
+ 'return_type' => 'SV *',
'name' => 'mpxs_Apache__RequestRec_read',
'attr' => [
'static'
1.295 +4 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.294
retrieving revision 1.295
diff -u -u -r1.294 -r1.295
--- Changes 23 Dec 2003 00:34:36 -0000 1.294
+++ Changes 23 Dec 2003 03:02:34 -0000 1.295
@@ -12,6 +12,10 @@
=item 1.99_13-dev
+fix the $r->read function to return undef on failure similar to the
+core perl function and make $! available for those who test for read()
+failures. [Stas]
+
Make sure that pnotes are destroyed after PerlCleanup handlers are
finished and not before + test. [Stas]