You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Ruediger Pluem <rp...@apache.org> on 2011/09/16 16:45:59 UTC

Re: svn commit: r1170330 - /httpd/httpd/trunk/modules/filters/mod_deflate.c


On 09/13/2011 10:17 PM, sf@apache.org wrote:
> Author: sf
> Date: Tue Sep 13 20:17:18 2011
> New Revision: 1170330
> 
> URL: http://svn.apache.org/viewvc?rev=1170330&view=rev
> Log:
> Fix 'Content-Encoding: gzip' missing if the first brigade passed to
> deflate_out_buffer contained zero data bytes but no EOS bucket.
> 
> Don't compress if the added headers and checksums are larger than
> the data to compress (and we know the size of the data in advance).
> 
> Modified:
>     httpd/httpd/trunk/modules/filters/mod_deflate.c
> 
> Modified: httpd/httpd/trunk/modules/filters/mod_deflate.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/filters/mod_deflate.c?rev=1170330&r1=1170329&r2=1170330&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/filters/mod_deflate.c (original)
> +++ httpd/httpd/trunk/modules/filters/mod_deflate.c Tue Sep 13 20:17:18 2011
> @@ -426,7 +426,7 @@ static apr_status_t deflate_out_filter(a
>      request_rec *r = f->r;
>      deflate_ctx *ctx = f->ctx;
>      int zRC;
> -    apr_size_t len;
> +    apr_size_t len = 0, blen;
>      const char *data;
>      deflate_filter_config *c;
>  
> @@ -448,28 +448,41 @@ static apr_status_t deflate_out_filter(a
>          char *token;
>          const char *encoding;
>  
> -        /* Delay initialization until we have seen some data */
> -        e = APR_BRIGADE_FIRST(bb);
> -        while (1) {
> -            apr_status_t rc;
> -            if (e == APR_BRIGADE_SENTINEL(bb))
> -                return ap_pass_brigade(f->next, bb);
> -            if (APR_BUCKET_IS_EOS(e)) {
> -                ap_remove_output_filter(f);
> -                return ap_pass_brigade(f->next, bb);
> -            }
> -            if (APR_BUCKET_IS_METADATA(e)) {
> -                e = APR_BUCKET_NEXT(e);
> -                continue;
> -            }
> +        e = APR_BRIGADE_LAST(bb);
> +        if (APR_BUCKET_IS_EOS(e)) {

Does this work if e is the the sentinel (in case of an empty brigade)?

Regards

RĂ¼diger


Re: svn commit: r1170330 - /httpd/httpd/trunk/modules/filters/mod_deflate.c

Posted by Stefan Fritsch <sf...@sfritsch.de>.
On Friday 16 September 2011, Ruediger Pluem wrote:
> On 09/13/2011 10:17 PM, sf@apache.org wrote:
> > Author: sf
> > Date: Tue Sep 13 20:17:18 2011
> > New Revision: 1170330
> > 
> > URL: http://svn.apache.org/viewvc?rev=1170330&view=rev
> > Log:
> > Fix 'Content-Encoding: gzip' missing if the first brigade passed
> > to deflate_out_buffer contained zero data bytes but no EOS
> > bucket.
> > 
> > Don't compress if the added headers and checksums are larger than
> > the data to compress (and we know the size of the data in
> > advance).
> > 
> > Modified:
> >     httpd/httpd/trunk/modules/filters/mod_deflate.c
> > 
> > Modified: httpd/httpd/trunk/modules/filters/mod_deflate.c
> > URL:
> > http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/filters/m
> > od_deflate.c?rev=1170330&r1=1170329&r2=1170330&view=diff
> > ================================================================
> > ============== ---
> > httpd/httpd/trunk/modules/filters/mod_deflate.c (original) +++
> > httpd/httpd/trunk/modules/filters/mod_deflate.c Tue Sep 13
> > 20:17:18 2011 @@ -426,7 +426,7 @@ static apr_status_t
> > deflate_out_filter(a
> > 
> >      request_rec *r = f->r;
> >      deflate_ctx *ctx = f->ctx;
> >      int zRC;
> > 
> > -    apr_size_t len;
> > +    apr_size_t len = 0, blen;
> > 
> >      const char *data;
> >      deflate_filter_config *c;
> > 
> > @@ -448,28 +448,41 @@ static apr_status_t deflate_out_filter(a
> > 
> >          char *token;
> >          const char *encoding;
> > 
> > -        /* Delay initialization until we have seen some data */
> > -        e = APR_BRIGADE_FIRST(bb);
> > -        while (1) {
> > -            apr_status_t rc;
> > -            if (e == APR_BRIGADE_SENTINEL(bb))
> > -                return ap_pass_brigade(f->next, bb);
> > -            if (APR_BUCKET_IS_EOS(e)) {
> > -                ap_remove_output_filter(f);
> > -                return ap_pass_brigade(f->next, bb);
> > -            }
> > -            if (APR_BUCKET_IS_METADATA(e)) {
> > -                e = APR_BUCKET_NEXT(e);
> > -                continue;
> > -            }
> > +        e = APR_BRIGADE_LAST(bb);
> > +        if (APR_BUCKET_IS_EOS(e)) {
> 
> Does this work if e is the the sentinel (in case of an empty
> brigade)?

No, but there is a check at the start of deflate_out_filter() that bb 
is not empty.