Thanks for your comments.
Commited in r1588527.

On Fri, Apr 4, 2014 at 11:39 PM, Yann Ylavic <ylavic....@gmail.com> wrote:
> On Fri, Apr 4, 2014 at 8:38 PM, Ruediger Pluem <rpl...@apache.org> wrote:
>> Why can't we fix that directly in ap_proxy_create_hdrbrgd?
>
> Actually we can, and that's indeed a much simpler patch.
>
> I was worried about modifications of "Content-Length" and/or
> "Transfer-Encoding" outside ap_proxy_create_hdrbrgd() (ie. in
> ap_proxy_http_request() itself) that would be needed by
> ap_http_filter(), but in fact all is good now regarding interactions
> between the two (recent draft-ietf-httpbis-p1-messaging-23 conformance
> commits/backport).
>
> Thus, we can simply not touch headers_in in ap_proxy_http_request(),
> simply resetting old_cl_val and old_te_val when needed.
>
>
> Thanks for your feedback, below is the corresponding patch (nearly
> back to the original patch of this thread).
>
> Regards,
> Yann.
>
> Index: modules/proxy/proxy_util.c
> ===================================================================
> --- modules/proxy/proxy_util.c    (revision 1584652)
> +++ modules/proxy/proxy_util.c    (working copy)
> @@ -3203,7 +3203,7 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_poo
>      char *buf;
>      const apr_array_header_t *headers_in_array;
>      const apr_table_entry_t *headers_in;
> -    apr_table_t *headers_in_copy;
> +    apr_table_t *saved_headers_in;
>      apr_bucket *e;
>      int do_100_continue;
>      conn_rec *origin = p_conn->connection;
> @@ -3279,6 +3279,21 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_poo
>      e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc);
>      APR_BRIGADE_INSERT_TAIL(header_brigade, e);
>
> +    /*
> +     * Save the original headers in here and restore them when leaving, since
> +     * we will apply proxy purpose only modifications (eg. clearing 
> hop-by-hop
> +     * headers, add Via or X-Forwarded-* or Expect...), whereas the originals
> +     * will be needed later to prepare the correct response and logging.
> +     *
> +     * Note: We need to take r->pool for apr_table_copy as the key / value
> +     * pairs in r->headers_in have been created out of r->pool and
> +     * p might be (and actually is) a longer living pool.
> +     * This would trigger the bad pool ancestry abort in apr_table_copy if
> +     * apr is compiled with APR_POOL_DEBUG.
> +     */
> +    saved_headers_in = r->headers_in;
> +    r->headers_in = apr_table_copy(r->pool, saved_headers_in);
> +
>      /* handle Via */
>      if (conf->viaopt == via_block) {
>          /* Block all outgoing Via: headers */
> @@ -3363,21 +3378,10 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_poo
>      }
>
>      proxy_run_fixups(r);
> -    /*
> -     * Make a copy of the headers_in table before clearing the connection
> -     * headers as we need the connection headers later in the http output
> -     * filter to prepare the correct response headers.
> -     *
> -     * Note: We need to take r->pool for apr_table_copy as the key / value
> -     * pairs in r->headers_in have been created out of r->pool and
> -     * p might be (and actually is) a longer living pool.
> -     * This would trigger the bad pool ancestry abort in apr_table_copy if
> -     * apr is compiled with APR_POOL_DEBUG.
> -     */
> -    headers_in_copy = apr_table_copy(r->pool, r->headers_in);
> -    ap_proxy_clear_connection(r, headers_in_copy);
> +    ap_proxy_clear_connection(r, r->headers_in);
> +
>      /* send request headers */
> -    headers_in_array = apr_table_elts(headers_in_copy);
> +    headers_in_array = apr_table_elts(r->headers_in);
>      headers_in = (const apr_table_entry_t *) headers_in_array->elts;
>      for (counter = 0; counter < headers_in_array->nelts; counter++) {
>          if (headers_in[counter].key == NULL
> @@ -3439,6 +3443,11 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_poo
>          e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc);
>          APR_BRIGADE_INSERT_TAIL(header_brigade, e);
>      }
> +
> +    /* Restore the original headers in (see comment above),
> +     * we won't modify them anymore.
> +     */
> +    r->headers_in = saved_headers_in;
>      return OK;
>  }
>
> Index: modules/proxy/mod_proxy_http.c
> ===================================================================
> --- modules/proxy/mod_proxy_http.c    (revision 1584652)
> +++ modules/proxy/mod_proxy_http.c    (working copy)
> @@ -750,14 +750,8 @@ int ap_proxy_http_request(apr_pool_t *p, request_r
>      if (!r->kept_body && r->main) {
>          /* XXX: Why DON'T sub-requests use keepalives? */
>          p_conn->close = 1;
> -        if (old_cl_val) {
> -            old_cl_val = NULL;
> -            apr_table_unset(r->headers_in, "Content-Length");
> -        }
> -        if (old_te_val) {
> -            old_te_val = NULL;
> -            apr_table_unset(r->headers_in, "Transfer-Encoding");
> -        }
> +        old_cl_val = NULL;
> +        old_te_val = NULL;
>          rb_method = RB_STREAM_CL;
>          e = apr_bucket_eos_create(input_brigade->bucket_alloc);
>          APR_BRIGADE_INSERT_TAIL(input_brigade, e);
> @@ -783,7 +777,6 @@ int ap_proxy_http_request(apr_pool_t *p, request_r
>                        "client %s (%s) requested Transfer-Encoding "
>                        "chunked body with Content-Length (C-L ignored)",
>                        c->client_ip, c->remote_host ? c->remote_host: "");
> -        apr_table_unset(r->headers_in, "Content-Length");
>          old_cl_val = NULL;
>          origin->keepalive = AP_CONN_CLOSE;
>          p_conn->close = 1;

Reply via email to