request_rec *r = f->r;
deflate_ctx *ctx = f->ctx;
int zRC;
+ char* buf;
+ int eos_only = 1;
+ apr_bucket *bkt;
+ char *token;
+ const char *encoding;
deflate_filter_config *c = ap_get_module_config(r->server->module_config,
&deflate_module);
* we're in better shape.
*/
if (!ctx) {
- int eos_only = 1;
- apr_bucket *bkt;
- char *buf, *token;
- const char *encoding;
/* only work on main request/no subrequests */
if (r->main) {
/* don't deflate responses with zero length e.g. proxied 304's but
* we do set the header on eos_only at this point for headers_filter
+ *
+ * if we get eos_only and come round again, we want to avoid redoing
+ * what we've already done, so set f->ctx to a flag here
+ */
+ f->ctx = ctx = (void*)-1;
+ }
+ if (ctx == (void*)-1) {
+ /* deal with the pathological case of lots of empty brigades and
+ * no knowledge of whether content will follow
*/
for (bkt = APR_BRIGADE_FIRST(bb);
bkt != APR_BRIGADE_SENTINEL(bb);
apr_table_unset(r->headers_out, "Content-Length");
return ap_pass_brigade(f->next, bb);
}
+ }
+ if (!ctx || (ctx==(void*)-1)) {
/* We're cool with filtering this. */
ctx = f->ctx = apr_pcalloc(r->pool, sizeof(*ctx));