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


Reply via email to