mirror of
https://github.com/apache/httpd.git
synced 2025-08-07 04:02:58 +03:00
Add a way to remove output filters. This is used by http_header_filter to
remove itself once it has actually sent the headers. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86690 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -360,6 +360,8 @@ AP_DECLARE(void) ap_add_input_filter(const char *name, void *ctx, request_rec *r
|
|||||||
AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx,
|
AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx,
|
||||||
request_rec *r, conn_rec *c);
|
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
|
/* 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
|
* 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
|
* want to change our filter registration method. The basic idea, is that
|
||||||
|
@@ -2228,11 +2228,6 @@ AP_CORE_DECLARE(int) ap_http_header_filter(ap_filter_t *f, ap_bucket_brigade *b)
|
|||||||
char *date = NULL;
|
char *date = NULL;
|
||||||
request_rec *r = f->r;
|
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->assbackwards) {
|
||||||
if (!r->main)
|
if (!r->main)
|
||||||
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
|
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
|
||||||
@@ -2325,6 +2320,7 @@ AP_CORE_DECLARE(int) ap_http_header_filter(ap_filter_t *f, ap_bucket_brigade *b)
|
|||||||
if (r->chunked) {
|
if (r->chunked) {
|
||||||
ap_bsetflag(r->connection->client, B_CHUNK, 1);
|
ap_bsetflag(r->connection->client, B_CHUNK, 1);
|
||||||
}
|
}
|
||||||
|
ap_remove_output_filter(f);
|
||||||
return ap_pass_brigade(f->next, b);
|
return ap_pass_brigade(f->next, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -155,6 +155,31 @@ AP_DECLARE(void) ap_add_input_filter(const char *name, void *ctx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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,
|
AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx,
|
||||||
request_rec *r, conn_rec *c)
|
request_rec *r, conn_rec *c)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user