Hi Hendrik, That seems like a good work around assuming the string gets cut off at the same place each time. Thanks for that, in my case, I'm not certain that it does. I thought the BUFF_LEN constant defines how many bytes should be read. My string is always within the first 5000 bytes, but setting BUFF_LEN to 8000 did not help as the buffer still sometimes gets cut after ~2500 bytes or so. Do you know of any way to force the bucket to be a certain length?
Thanks Chris On Thu, Mar 31, 2011 at 10:07 AM, Hendrik Schumacher <h...@activeframe.de>wrote: > Am Do, 31.03.2011, 06:30 schrieb Chris Datfung: > > On Wed, Mar 30, 2011 at 12:36 PM, Hendrik Schumacher > > <h...@activeframe.de>wrote: > > > >> Am Mi, 30.03.2011, 12:17 schrieb Chris Datfung: > >> > >> I had a similar problem with a http proxy that injected a string into > >> the > >> HTML body. If the response is passed to the filter in multiple parts > >> there > >> is a certain probability that the response is split on the string > >> position > >> you are looking for (for example part 2 ends with "</bo" and part 3 > >> starts > >> with "dy>"). I had to buffer the last bytes of each response part and > >> take > >> them into account > > > > > > Hi Hendrik, > > > > That is exactly the problem. How did you buffer the last bytes of each > > response. Don't you just set the BUFF_LEN and thats the number of > > characters > > you get? > > > > Chris > > > > You have to handle the "last bytes buffer" yourself. If you use the > f->read approach of Apache2::Filter, you could use the following (untested > and probably not very efficient): > > my $lastbytes = undef; > my $done = undef; > while ($filter->read(my $buffer, $wanted)) { > { > if ($lastbytes) > { > $buffer = $lastbytes.$buffer; > $lastbytes = undef; > } > if (not $done) > { > if ($buffer =~ s/<\/body>/$injection<\/body>/) > { > $done = 1; > } > else > { > $lastbytes = substr ($buffer, -6); # length of string to search - 1 > $buffer = substr ($buffer, 0, -6); > } > } > $filter->print($buffer); > } > if ($filter->seen_eos && $lastbytes) { > $filter->print($lastbytes); > } > > If you are using the callback approach, you would have to store $lastbytes > somewhere (eg in $filter->ctx) and make sure to flush $lastbytes on eos. > > Hendrik > > >