Hello mod_perlers,

According to the code supplied by Jeff, It appears that the only way the
byte range filter can be bypassed is when the content length is <= 0 or the
EOS is not in the brigade.  I know that my content length is not zero, as it
specifically set in my test code.  Is there a way to ensure that the EOS is
set on the brigade?  This is the test handler that is not properly
acknowledging the Range: header:

sub handler {
      my $r = shift;
      $r->content_type('video/x-flv');
      $r->set_content_length('2533148');
      $r->sendfile('/var/www/perl/tmpfiles/mygcx/flvplayernew17.flv');
      return Apache2::Const::OK;
  }

Can anyone point me in the right direction here?  Thanks.

On Thu, Jun 18, 2009 at 10:56 AM, Jeff Trawick <traw...@gmail.com> wrote:

> On Thu, Jun 18, 2009 at 10:22 AM, Adriano Caloiaro <acalo...@gmail.com>wrote:
>
>> Hello,
>>
>> Could someone point me in the correct direction to support byte range
>> responses in mod_perl2?  From what I've read, Apache should understand that
>> it needs to apply the byterange filter whenever $r->sendfile is used on a
>> large file and the Range: header is present in the incoming request.
>> However what I'm seeing is that the entire file is returned for each byte
>> range requested by the client.
>>
>> Access log serving off disk in Apache2:
>>
>> *.*.*.* - - [17/Jun/2009:19:50:30 -0400] "GET
>> /mygcx/test/flvplayernew17.flv HTTP/1.1" 206 1 "-" "-"
>> *.*.*.* - - [17/Jun/2009:19:50:31 -0400] "GET
>> /mygcx/test/flvplayernew17.flv HTTP/1.1" 206 435996 "-" "-"
>> *.*.*.* - - [17/Jun/2009:19:50:30 -0400] "GET
>> /mygcx/test/flvplayernew17.flv HTTP/1.1" 206 2097152 "-" "-"
>>
>> Serving from perl handler:
>>
>> *.*.*.* - - [18/Jun/2009:10:11:43 -0400] "GET
>> /mygcx/test/flvplayernew17.flv HTTP/1.1" 200 2533148 "-" "-"
>> *.*.*.* - - [18/Jun/2009:10:11:45 -0400] "GET
>> /mygcx/test/flvplayernew17.flv HTTP/1.1" 200 2533148 "-" "-"
>> *.*.*.* - - [18/Jun/2009:10:11:45 -0400] "GET
>> /mygcx/test/flvplayernew17.flv HTTP/1.1" 200 2533148 "-" "-"
>>
>
> Maybe these checks are bypassing range processing?  (httpd 2.2.x,
> byterange_filter.c)
>
>     /* Iterate through the brigade until reaching EOS or a bucket with
>      * unknown length. */
>     for (e = APR_BRIGADE_FIRST(bb);
>          (e != APR_BRIGADE_SENTINEL(bb) && !APR_BUCKET_IS_EOS(e)
>           && e->length != (apr_size_t)-1);
>          e = APR_BUCKET_NEXT(e)) {
>         clength += e->length;
>     }
>
>     /* Don't attempt to do byte range work if this brigade doesn't
>      * contain an EOS, or if any of the buckets has an unknown length;
>      * this avoids the cases where it is expensive to perform
>      * byteranging (i.e. may require arbitrary amounts of memory). */
>     if (!APR_BUCKET_IS_EOS(e) || clength <= 0) {
>         ap_remove_output_filter(f);
>         return ap_pass_brigade(f->next, bb);
>     }
>
>
>>
>>
>> It would seem like re-invited in the wheel if I were to implement RFC 2616
>> in perl when there is a byterange filter already present in apache.  Thank
>> you for any help!
>
>
> See if these byterange requirements can be met.  (Somebody that knows more
> about mod_perl may have to check for you.  It depends on how data is passed
> to httpd.)
>
>

Reply via email to