AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx,
request_rec *r, conn_rec *c);
+AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f);
+
/* The next two filters are for abstraction purposes only. They could be
* done away with, but that would require that we break modules if we ever
* want to change our filter registration method. The basic idea, is that
char *date = NULL;
request_rec *r = f->r;
- if ((int)f->ctx != 0) {
- return ap_pass_brigade(f->next, b);
- }
- (int)f->ctx++;
-
if (r->assbackwards) {
if (!r->main)
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
if (r->chunked) {
ap_bsetflag(r->connection->client, B_CHUNK, 1);
}
+ ap_remove_output_filter(f);
return ap_pass_brigade(f->next, b);
}
}
}
+AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f)
+{
+ ap_filter_t *curr;
+
+ curr = f->r ? f->r->output_filters : f->c->output_filters;
+
+ if (curr == f) {
+ if (f->r) {
+ f->r->output_filters = f->r->output_filters->next;
+ }
+ else {
+ f->c->output_filters = f->c->output_filters->next;
+ }
+ return;
+ }
+
+ while (curr->next != f) {
+ if (curr == NULL) {
+ return;
+ }
+ curr = curr->next;
+ }
+ curr->next = f->next ? f->next : NULL;
+}
+
AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx,
request_rec *r, conn_rec *c)
{