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
>
>
>

Reply via email to