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 <[email protected]> wrote:
> On Thu, Jun 18, 2009 at 10:22 AM, Adriano Caloiaro <[email protected]>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.)
>
>