You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gr...@apache.org on 2007/07/06 21:36:31 UTC

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

Author: gregames
Date: Fri Jul  6 12:36:30 2007
New Revision: 554011

URL: http://svn.apache.org/viewvc?view=rev&rev=554011
Log:
with LimitRequestBody xxx and the deflate output filter configured, mod_deflate
eats the 413 error bucket, a 500 error is logged, and a blank screen appears
at the browser.

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?view=diff&rev=554011&r1=554010&r2=554011
==============================================================================
--- httpd/httpd/trunk/modules/filters/mod_deflate.c (original)
+++ httpd/httpd/trunk/modules/filters/mod_deflate.c Fri Jul  6 12:36:30 2007
@@ -44,6 +44,7 @@
 #include "http_request.h"
 #define APR_WANT_STRFUNC
 #include "apr_want.h"
+#include "http_protocol.h"
 
 #include "zlib.h"
 
@@ -576,6 +577,11 @@
                 return rv;
             }
             continue;
+        }
+
+        if (AP_BUCKET_IS_ERROR(e)) {
+            ap_remove_output_filter(f);
+            return ap_pass_brigade(f->next, bb);
         }
 
         /* read */



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

Posted by Ruediger Pluem <rp...@apache.org>.

On 07/06/2007 09:36 PM, gregames@apache.org wrote:
> Author: gregames
> Date: Fri Jul  6 12:36:30 2007
> New Revision: 554011
> 
> URL: http://svn.apache.org/viewvc?view=rev&rev=554011
> Log:
> with LimitRequestBody xxx and the deflate output filter configured, mod_deflate
> eats the 413 error bucket, a 500 error is logged, and a blank screen appears
> at the browser.
> 
> 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?view=diff&rev=554011&r1=554010&r2=554011
> ==============================================================================
> --- httpd/httpd/trunk/modules/filters/mod_deflate.c (original)
> +++ httpd/httpd/trunk/modules/filters/mod_deflate.c Fri Jul  6 12:36:30 2007
> @@ -44,6 +44,7 @@
>  #include "http_request.h"
>  #define APR_WANT_STRFUNC
>  #include "apr_want.h"
> +#include "http_protocol.h"
>  
>  #include "zlib.h"
>  
> @@ -576,6 +577,11 @@
>                  return rv;
>              }
>              continue;
> +        }
> +
> +        if (AP_BUCKET_IS_ERROR(e)) {
> +            ap_remove_output_filter(f);
> +            return ap_pass_brigade(f->next, bb);
>          }
>  
>          /* read */


Two comments:

1. IMHO this does not work well if a proxy backend breaks in the middle of the response and sends
   an error bucket up the chain (ap_proxy_backend_broke). This can lead to a mixture of uncompressed
   and compressed content in the response and a correct partial response might be valuable for
   the client in order to continue the connection where it broke with a range request.

2. In principle the inflate output filter suffers from the same problem.

The following patch should address both points. Comments?

Index: modules/filters/mod_deflate.c
===================================================================
--- modules/filters/mod_deflate.c       (Revision 554244)
+++ modules/filters/mod_deflate.c       (Arbeitskopie)
@@ -579,9 +579,14 @@
             continue;
         }

-        if (AP_BUCKET_IS_ERROR(e)) {
-            ap_remove_output_filter(f);
-            return ap_pass_brigade(f->next, bb);
+        if (APR_BUCKET_IS_METADATA(e)) {
+            /*
+             * Remove meta data bucket from old brigade and insert into the
+             * new.
+             */
+            APR_BUCKET_REMOVE(e);
+            APR_BRIGADE_INSERT_TAIL(ctx->bb, e);
+            continue;
         }

         /* read */
@@ -1087,6 +1092,16 @@
             continue;
         }

+        if (APR_BUCKET_IS_METADATA(e)) {
+            /*
+             * Remove meta data bucket from old brigade and insert into the
+             * new.
+             */
+            APR_BUCKET_REMOVE(e);
+            APR_BRIGADE_INSERT_TAIL(ctx->bb, e);
+            continue;
+        }
+
         /* read */
         apr_bucket_read(e, &data, &len, APR_BLOCK_READ);


Regards

RĂ¼diger