Commit 29d579d9 authored by Graham Leggett's avatar Graham Leggett
Browse files

Make sure the filter stack in a reused downstream connection is reset

so we don't get lots of DECHUNK filters when we don't want them.
PR:
Obtained from:
Reviewed by:


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88797 13f79535-47bb-0310-9956-ffa450edef68
parent 6baf186e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -243,5 +243,6 @@ int ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
int ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
int ap_proxy_pre_http_connection(conn_rec *c, request_rec *r);
apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen);
void ap_proxy_reset_output_filters(conn_rec *c);

#endif /*MOD_PROXY_H*/
+4 −0
Original line number Diff line number Diff line
@@ -313,6 +313,9 @@ int ap_proxy_http_handler(request_rec *r, char *url,
	origin = conf->connection;
	new = 0;

	/* reset the connection filters */
	ap_proxy_reset_output_filters(origin);

	/* XXX FIXME: If the socket has since closed, change new to 1 so
	 * a new socket is opened */
    }
@@ -699,6 +702,7 @@ int ap_proxy_http_handler(request_rec *r, char *url,
	    if ((buf = ap_proxy_removestr(r->pool, buf, "chunked"))) {
		apr_table_set(r->headers_out, "Transfer-Encoding", buf);
	    }
/* FIXME: Make sure this filter is removed if this connection is reused */
	    ap_add_input_filter("DECHUNK", NULL, rp, origin);
	}

+19 −0
Original line number Diff line number Diff line
@@ -1131,6 +1131,25 @@ apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buf

}

/* remove other filters (like DECHUNK) from filter stack */
void ap_proxy_reset_output_filters(conn_rec *c)
{
    ap_filter_t *f = c->output_filters;

    while (f) {
        if (!strcasecmp(f->frec->name, "CORE") ||
            !strcasecmp(f->frec->name, "CONTENT_LENGTH") ||
            !strcasecmp(f->frec->name, "HTTP_HEADER")) {
            f = f->next;
            continue;
        }
        else {
            ap_remove_output_filter(f);
            f = f->next;
        }
    }
}

#if defined WIN32

static DWORD tls_index;