Tuomo Salo wrote:
> Under mod_perl2 the return value of print seems to be the number of
> bytes printed. I run across a legacy app (a registry script), that
> frequently used the following idiom:
>
>
> print(CGI::redirect("url_to_error_page")) and return if $error;
>
>
> While this is obviously a stupid way to write, it seems ok since the
> perldoc for print says: "Prints a string or a list of strings. Returns
> true if successful."
> Now the redirection will be performed, and an empty string is passed to
> print. print has been overridden by mod_perl2, and will now return the
> number of bytes written, that is, 0. The "and" will naturally
> short-circuit, and the "return" will never be reached.
ok, try this patch.
--Geoff
Index: xs/maps/modperl_functions.map
===================================================================
--- xs/maps/modperl_functions.map (revision 111510)
+++ xs/maps/modperl_functions.map (working copy)
@@ -48,7 +48,7 @@
MODULE=Apache::RequestIO PACKAGE=Apache::RequestRec
SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=Nullsv
- apr_size_t:DEFINE_PRINT | | ...
+ SV *:DEFINE_PRINT | | ...
apr_size_t:DEFINE_PRINTF | | ...
SV *:DEFINE_BINMODE | | request_rec *:r
SV *:DEFINE_CLOSE | | request_rec *:r
Index: xs/Apache/RequestIO/Apache__RequestIO.h
===================================================================
--- xs/Apache/RequestIO/Apache__RequestIO.h (revision 111510)
+++ xs/Apache/RequestIO/Apache__RequestIO.h (working copy)
@@ -75,8 +75,8 @@
}
static MP_INLINE
-apr_size_t mpxs_Apache__RequestRec_print(pTHX_ I32 items,
- SV **MARK, SV **SP)
+SV *mpxs_Apache__RequestRec_print(pTHX_ I32 items,
+ SV **MARK, SV **SP)
{
modperl_config_req_t *rcfg;
request_rec *r;
@@ -95,7 +95,7 @@
mpxs_output_flush(r, rcfg, "Apache::RequestIO::print");
- return bytes;
+ return bytes ? newSVuv(bytes) : newSVpvn("0E0", 3);
}
static MP_INLINE
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
--- xs/tables/current/ModPerl/FunctionTable.pm (revision 111510)
+++ xs/tables/current/ModPerl/FunctionTable.pm (working copy)
@@ -6766,7 +6766,7 @@
]
},
{
- 'return_type' => 'apr_size_t',
+ 'return_type' => 'SV *',
'name' => 'mpxs_Apache__RequestRec_print',
'args' => [
{
Index: t/response/TestModperl/print.pm
===================================================================
--- t/response/TestModperl/print.pm (revision 111510)
+++ t/response/TestModperl/print.pm (working copy)
@@ -12,7 +12,7 @@
sub handler {
my $r = shift;
- plan $r, tests => 3;
+ plan $r, tests => 6;
binmode STDOUT; #Apache::RequestRec::BINMODE (noop)
@@ -20,8 +20,23 @@
ok 2;
- printf "ok %d\n", 3;
+ {
+ # print should return true on success, even
+ # if it sends no data.
+ my $rc = print '';
+ ok ($rc);
+ ok ($rc == 0); # 0E0 is still numerically 0
+ }
+
+ {
+ my $rc = print "# 11 bytes\n"; # don't forget the newline
+
+ ok ($rc == 11);
+ }
+
+ printf "ok %d\n", 6;
+
Apache::OK;
}
Index: t/response/TestAPI/request_rec.pm
===================================================================
--- t/response/TestAPI/request_rec.pm (revision 111510)
+++ t/response/TestAPI/request_rec.pm (working copy)
@@ -95,7 +95,7 @@
{
local $| = 0;
ok t_cmp $r->print("# buffered\n"), 11, "buffered print";
- ok t_cmp $r->print(), 0, "buffered print";
+ ok t_cmp $r->print(), "0E0", "buffered print";
local $| = 1;
my $string = "# not buffered\n";
--
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html