stas 2002/12/16 23:15:46 Modified: xs/Apache/RequestIO Apache__RequestIO.h . Changes t/response/TestApache read.pm Log: fix $r->read to read all the requested amount of data if possible, adjust the test TestApache::read to verify that Revision Changes Path 1.29 +24 -5 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.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- Apache__RequestIO.h 14 Aug 2002 14:54:47 -0000 1.28 +++ Apache__RequestIO.h 17 Dec 2002 07:15:46 -0000 1.29 @@ -177,7 +177,7 @@ SV *buffer, int bufsiz, int offset) { - long nrd = 0; + long total = 0; int rc; if ((rc = mpxs_setup_client_block(r)) != APR_SUCCESS) { @@ -185,20 +185,39 @@ } if (mpxs_should_client_block(r)) { + long nrd; /* ap_should_client_block() will return 0 if r->read_length */ mpxs_sv_grow(buffer, bufsiz+offset); - nrd = ap_get_client_block(r, SvPVX(buffer)+offset, bufsiz); + while (bufsiz) { + nrd = ap_get_client_block(r, SvPVX(buffer)+offset+total, bufsiz); + if (nrd > 0) { + total += nrd; + bufsiz -= nrd; + } + else if (nrd == 0) { + break; + } + else { + /* + * XXX: as stated in ap_get_client_block, the real + * error gets lots, so we only know that there was one + */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "mod_perl: $r->read failed to read"); + break; + } + } } - if (nrd > 0) { - mpxs_sv_cur_set(buffer, nrd+offset); + if (total > 0) { + mpxs_sv_cur_set(buffer, offset+total); SvTAINTED_on(buffer); } else { sv_setpvn(buffer, "", 0); } - return nrd; + return total; } static MP_INLINE 1.85 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.84 retrieving revision 1.85 diff -u -r1.84 -r1.85 --- Changes 15 Dec 2002 08:30:39 -0000 1.84 +++ Changes 17 Dec 2002 07:15:46 -0000 1.85 @@ -10,6 +10,9 @@ =item 1.99_08-dev +fix $r->read to read all the requested amount of data if possible, +adjust the test TestApache::read to verify that [Stas] + fix the method content() in Apache::compat to read a whole request body. same for ModPerl::Test::read_post. add tests. [Stas] 1.3 +8 -4 modperl-2.0/t/response/TestApache/read.pm Index: read.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestApache/read.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- read.pm 11 Apr 2002 11:08:44 -0000 1.2 +++ read.pm 17 Dec 2002 07:15:46 -0000 1.3 @@ -18,11 +18,15 @@ my $buffer = ""; my $bufsiz = $r->args || BUFSIZ; - while ((my($offset) = length($buffer)) < $ct) { - my $remain = $ct - $offset; + my $offset = 0; + while (my $remain = $ct - $offset) { my $len = $remain >= $bufsiz ? $bufsiz : $remain; - last unless $len > 0; - $r->read($buffer, $len, $offset); + my $read = $r->read($buffer, $len, $offset); + if ($read != $len) { + die "read only ${read}b, while ${len}b were requested\n"; + } + last unless $read > 0; + $offset += $read; } #make sure we dont block after all data is read