httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alex Krohn <a...@gt.net>
Subject range request support using ap_send_fd
Date Fri, 25 May 2012 01:29:58 GMT
Hi,

I'm working on a problem where mod_perl doesn't seem to accept range
requests documented here:

    http://www.gossamer-threads.com/lists/modperl/dev/104360

Working with 2.2.22, my issue seems to be the mod_perl sendfile
implementation uess ap_send_fd, and ap_send_fd does not create an EOS
bucket, so in byterange_filter.c:

/*
* 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);
} 

we don't handle range requests, and so my mod_perl handler does not work
with range requests.

My question is should ap_send_fd be inserting an eos bucket? i.e.

alex@alex ~/httpd-2.2.22 $ diff -u server/protocol.c.orig server/protocol.c
--- server/protocol.c.orig	2012-01-24 12:02:19.000000000 -0800
+++ server/protocol.c	2012-05-24 18:24:57.914018451 -0700
@@ -1386,6 +1386,8 @@
     bb = apr_brigade_create(r->pool, c->bucket_alloc);
     b = apr_bucket_file_create(fd, offset, len, r->pool, c->bucket_alloc);
     APR_BRIGADE_INSERT_TAIL(bb, b);
+    b = apr_bucket_eos_create(c->bucket_alloc);
+    APR_BRIGADE_INSERT_TAIL(bb, b);
 
     rv = ap_pass_brigade(r->output_filters, bb);
     if (rv != APR_SUCCESS) {
alex@alex ~/httpd-2.2.22 $ 

which does "fix" the problem for me (i.e. range requests work), but I
have no idea the implications behind this and the warning in the comment
about arbitrary amounts of memory. =)

Thanks for any help/guidance you can provide.

Cheers,

Alex

Mime
View raw message