new->read_length = r->read_length; /* We can only read it once */
new->vlist_validator = r->vlist_validator;
- new->output_filters = r->connection->output_filters;
- new->input_filters = r->connection->input_filters;
+ new->proto_output_filters = r->proto_output_filters;
+ new->proto_input_filters = r->proto_input_filters;
+
+ new->output_filters = new->proto_output_filters;
+ new->input_filters = new->proto_input_filters;
ap_add_input_filter("HTTP_IN", NULL, new, new->connection);
r->err_headers_out);
r->subprocess_env = apr_table_overlay(r->pool, rr->subprocess_env,
r->subprocess_env);
+
+ r->output_filters = rr->output_filters;
+ r->input_filters = rr->input_filters;
}
AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r)
r->request_config = ap_create_request_config(r->pool);
/* Must be set before we run create request hook */
- r->output_filters = conn->output_filters;
- r->input_filters = conn->input_filters;
+ r->proto_output_filters = conn->output_filters;
+ r->output_filters = r->proto_output_filters;
+ r->proto_input_filters = conn->input_filters;
+ r->input_filters = r->proto_input_filters;
ap_run_create_request(r);
r->per_dir_config = r->server->lookup_defaults;
/* start with the same set of output filters */
if (next_filter) {
+ /* no input filters for a subrequest */
rnew->output_filters = next_filter;
+ ap_add_output_filter_handle(ap_subreq_core_filter_handle,
+ NULL, rnew, rnew->connection);
}
else {
- rnew->output_filters = r->output_filters;
+ /* If NULL - we are expecting to be internal_fast_redirect'ed
+ * to this subrequest - or this request will never be invoked.
+ * Ignore the original request filter stack entirely, and
+ * drill the input and output stacks back to the connection.
+ */
+ rnew->proto_input_filters = r->proto_input_filters;
+ rnew->proto_output_filters = r->proto_output_filters;
+
+ rnew->input_filters = r->proto_input_filters;
+ rnew->output_filters = r->proto_output_filters;
}
- ap_add_output_filter_handle(ap_subreq_core_filter_handle,
- NULL, rnew, rnew->connection);
/* no input filters for a subrequest */
static ap_filter_t *add_any_filter(const char *name, void *ctx,
request_rec *r, conn_rec *c,
const filter_trie_node *reg_filter_set,
- ap_filter_t **r_filters,
+ ap_filter_t **r_filters,
+ ap_filter_t **p_filters,
ap_filter_t **c_filters)
{
if (reg_filter_set) {
if (node && node->frec) {
apr_pool_t* p = r ? r->pool : c->pool;
ap_filter_t *f = apr_palloc(p, sizeof(*f));
- ap_filter_t **outf = r ? r_filters : c_filters;
+ ap_filter_t **outf = r ? (r_filters ? r_filters : p_filters) : c_filters;
f->frec = node->frec;
f->ctx = ctx;
static ap_filter_t *add_any_filter_handle(ap_filter_rec_t *frec, void *ctx,
request_rec *r, conn_rec *c,
ap_filter_t **r_filters,
+ ap_filter_t **p_filters,
ap_filter_t **c_filters)
{
apr_pool_t* p = r ? r->pool : c->pool;
ap_filter_t *f = apr_palloc(p, sizeof(*f));
- ap_filter_t **outf = r ? r_filters : c_filters;
+ ap_filter_t **outf = r ? (r_filters ? r_filters : p_filters) : c_filters;
f->frec = frec;
f->ctx = ctx;
request_rec *r, conn_rec *c)
{
return add_any_filter(name, ctx, r, c, registered_input_filters,
- r ? &r->input_filters : NULL, &c->input_filters);
+ r ? &r->input_filters : NULL,
+ r ? &r->proto_input_filters : NULL, &c->input_filters);
}
AP_DECLARE(ap_filter_t *) ap_add_input_filter_handle(ap_filter_rec_t *f,
conn_rec *c)
{
return add_any_filter_handle(f, ctx, r, c, r ? &r->input_filters : NULL,
+ r ? &r->proto_input_filters : NULL,
&c->input_filters);
}
request_rec *r, conn_rec *c)
{
return add_any_filter(name, ctx, r, c, registered_output_filters,
- r ? &r->output_filters : NULL, &c->output_filters);
+ r ? &r->output_filters : NULL,
+ r ? &r->proto_output_filters : NULL, &c->output_filters);
}
AP_DECLARE(ap_filter_t *) ap_add_output_filter_handle(ap_filter_rec_t *f,
conn_rec *c)
{
return add_any_filter_handle(f, ctx, r, c, r ? &r->output_filters : NULL,
+ r ? &r->proto_output_filters : NULL,
&c->output_filters);
}