perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Louis-David Mitterrand <vindex+lists-modp...@apartia.org>
Subject Re: strange mod_deflate behaviour on binary output
Date Mon, 23 Mar 2009 10:17:02 GMT
On Sun, Mar 22, 2009 at 09:23:49PM -0400, Philippe M. Chiasson wrote:
> On 22/3/09 15:25, Louis-David Mitterrand wrote:
> > Hi,
> > 
> > I noticed something interesting with mod_deflate when serving binary
> > content from a mason component:
> > 
> > 	<%init>
> > 	$m->clear_buffer();
> > 	$r->content_type("video/mp4");
> > 	$r->headers_out->add('Content-length' => -s $file);
> > 	$r->sendfile($file);
> > 	$m->abort(200);
> > 	</%init>
> > 
> > mod_deflate is enabled with the default:
> > 
> > 	AddOutputFilterByType DEFLATE text/html text/plain text/xml
> > 
> > and .md mason components have:
> > 
> > 	AddType text/html .md
> > 
> > But when I change the content-type from within the component mod_deflate
> > doesn't seem to notice and keeps gzip'ing the video/mp4 output, which
> > FlowPlayer doesn't appreciate.
> > 
> > I certainly could disable mod_deflate and be on my merry way. 
> > 
> > But I thought I'd ask the modperl list (already posted to mason-users)
> > whether this mod_deflate behaviour is expected and/or normal?
> 
> Sounds like Mason runs exclusively in the PerlResponse phase, at which
> point, AddOutputFilterByType has already decided if it should apply the
> filter or not, so it's too late to change that.
> 
> One easy way to disable mod_deflate from that point in time, from mason,
> would be to do:
> 
> $r->subprocess_env('no-gzip' => 1);
> 
> Since from mod_deflate.c:
> 
>         /* some browsers might have problems, so set no-gzip
>          * (with browsermatch) for them
>          */
>         if (apr_table_get(r->subprocess_env, "no-gzip")) {
>             ap_remove_output_filter(f);
>             return ap_pass_brigade(f->next, bb);
>         }
> 
> Give it a try, this is untested!

And this works fine! Thank you.

Another possible (less robust) solution is to add this to deflate.conf:

	SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary

This only works if the $r->uri ends with .mp4 which in my case does
because I use an explicit $r->path_info:

/video.md/directory/file.mp4

"/directory/file.mp4" points to a directory hierarchy outside of the
ServerRoot.

Cheers,

-- 
http://www.critikart.net

Mime
View raw message