On Wed, 6 Sep 2000, Reif Peter wrote:

> I am using a self written mod_perl module that does proxy requests. It acts
> as content handler and fetches the requestet documents via LWP::UserAgent.
> The program works fine but when the request is a POST request and the
> response is a redirection (301, 302, ...) with a Location: header, no data
> is sent to the browser.
> 
> If I don't read the postet data, everything works. So my suspicion is the
> following:
> For any reason, if the module returns a redirecting result code (301, 302,
> ...), mod_perl tries to read again the posted data and waits forever.
> 
> My solution is simple: Just set the Content-lengt: header to undef:
> 
>       $r->header_in('Content-length' => undef);
> 
> Is this a bug or a feature?

it's a known issue, from the ToDo:
"- should $r->content unset $r->headers_in('content-length') ?
NOTE: im worried this could break apps who need to know content-length 
after data has been read"

looking at mod_perl Changes:

=item 1.00b2 - 07/07/97
...
make compatible with 1.2.1 r->read_length change so we don't hang
on file uploads

the problem is that a drastic api change in Apache was made around that
time, which we had to fit into Perl's api.  ap_setup_client_block() and
ap_should_client_block() are only supposed to be called once according to
the api spec.  Apache.xs calls them everytime $r->read is called, and the
change above was setting r->read_length = 0; so ap_setup_client_block()
would return true the second time it is called.  when a redirect or error
is thrown, ap_discard_request_body() also checks ap_should_client_block()
which returns true because we've set r->read_length = 0;
so, i think a reasonable fix for now is to localize the r->read_length
change with this patch:

Index: src/modules/perl/Apache.xs
===================================================================
RCS file: /home/cvs/modperl/src/modules/perl/Apache.xs,v
retrieving revision 1.109
diff -u -r1.109 Apache.xs
--- src/modules/perl/Apache.xs  2000/09/27 16:25:56     1.109
+++ src/modules/perl/Apache.xs  2000/09/27 19:19:20
@@ -954,7 +954,7 @@
     int      bufsiz
 
     PREINIT:
-    long nrd = 0;
+    long nrd = 0, old_read_length;
     int rc;
 
     PPCODE:
@@ -964,12 +964,15 @@
        XSRETURN_UNDEF;
     }
 
+    old_read_length = r->read_length;
+    r->read_length = 0;
+
     if (should_client_block(r)) {
         SvUPGRADE(buffer, SVt_PV);
         SvGROW(buffer, bufsiz+1);
         nrd = get_client_block(r, SvPVX(buffer), bufsiz);
-        r->read_length = 0;
-    } 
+    }
+    r->read_length += old_read_length;
 
     if (nrd > 0) {
         XPUSHs(sv_2mortal(newSViv((long)nrd)));

Reply via email to