Commit 43a77e22 authored by Yann Ylavic's avatar Yann Ylavic
Browse files

mod_proxy_hcheck: take balancer's SSLProxy* directives into account.

mod_proxy_hcheck was missing the merge of SSLProxy* directives defined by
balancer with the ones of the VirtualHost.

Since ap_proxy_connection_create_ex() needs a merged r->per_dir_config to apply
the correct SSL configuration, let's split create_request_rec() in two:
- create_request_rec() to only initialize the non-connection fields and merge
  balancer->section_config into r->per_dir_config,
- set_request_connection() to associate the connection with the request once
  it's been created from the merged configuration of the minimal request.

The issue was reported on the users@ mailing list:
https://lists.apache.org/thread.html/895cf250104b081b789101b1086b71a26d9c337db7123c5a552b7c69@%3Cusers.httpd.apache.org%3E


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1836276 13f79535-47bb-0310-9956-ffa450edef68
parent 2c08e53c
Loading
Loading
Loading
Loading
+30 −18
Changes for modules/proxy/mod_proxy_hcheck.c: 30 added lines, 18 removed lines.
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ typedef struct {
typedef struct {
    apr_pool_t *ptemp;
    sctx_t *ctx;
    proxy_balancer *balancer;
    proxy_worker *worker;
    proxy_worker *hc;
    apr_time_t now;
@@ -330,16 +331,22 @@ static const char *set_hc_tpsize (cmd_parms *cmd, void *dummy, const char *arg)
 * Use our short-lived pool for bucket_alloc so that we can simply move
 * buckets and use them after the backend connection is released.
 */
static request_rec *create_request_rec(apr_pool_t *p, conn_rec *conn, const char *method)
static request_rec *create_request_rec(apr_pool_t *p, server_rec *s,
                                       proxy_balancer *balancer,
                                       const char *method)
{
    request_rec *r;
    apr_bucket_alloc_t *ba;

    r = apr_pcalloc(p, sizeof(request_rec));
    ba = apr_bucket_alloc_create(p);
    r->pool            = p;
    r->connection      = conn;
    r->connection->bucket_alloc = ba;
    r->server          = conn->base_server;
    r->server          = s;

    r->per_dir_config = r->server->lookup_defaults;
    if (balancer->section_config) {
        r->per_dir_config = ap_merge_per_dir_configs(r->pool,
                                                     r->per_dir_config,
                                                     balancer->section_config);
    }

    r->proxyreq        = PROXYREQ_RESPONSE;

@@ -356,16 +363,9 @@ static request_rec *create_request_rec(apr_pool_t *p, conn_rec *conn, const char
    r->trailers_out    = apr_table_make(r->pool, 1);
    r->notes           = apr_table_make(r->pool, 5);

    r->kept_body       = apr_brigade_create(r->pool, r->connection->bucket_alloc);
    r->request_config  = ap_create_request_config(r->pool);
    /* Must be set before we run create request hook */

    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;
    r->per_dir_config  = r->server->lookup_defaults;

    r->sent_bodyct     = 0;                      /* bytect isn't for body */

    r->read_length     = 0;
@@ -379,9 +379,6 @@ static request_rec *create_request_rec(apr_pool_t *p, conn_rec *conn, const char
     */
    r->used_path_info = AP_REQ_DEFAULT_PATH_INFO;

    r->useragent_addr = conn->client_addr;
    r->useragent_ip = conn->client_ip;


    /* Time to populate r with the data we have. */
    r->method = method;
@@ -403,6 +400,19 @@ static request_rec *create_request_rec(apr_pool_t *p, conn_rec *conn, const char
    return r;
}

static void set_request_connection(request_rec *r, conn_rec *conn)
{
    conn->bucket_alloc = apr_bucket_alloc_create(r->pool);
    r->connection = conn;

    r->kept_body = apr_brigade_create(r->pool, conn->bucket_alloc);
    r->output_filters = r->proto_output_filters = conn->output_filters;
    r->input_filters = r->proto_input_filters = conn->input_filters;

    r->useragent_addr = conn->client_addr;
    r->useragent_ip = conn->client_ip;
}

static void create_hcheck_req(wctx_t *wctx, proxy_worker *hc,
                              apr_pool_t *p)
{
@@ -752,13 +762,14 @@ static apr_status_t hc_check_http(baton_t *baton)
        return backend_cleanup("HCOH", backend, ctx->s, status);
    }

    r = create_request_rec(ptemp, ctx->s, baton->balancer, wctx->method);
    if (!backend->connection) {
        if ((status = ap_proxy_connection_create("HCOH", backend, NULL, ctx->s)) != OK) {
        if ((status = ap_proxy_connection_create_ex("HCOH", backend, r)) != OK) {
            return backend_cleanup("HCOH", backend, ctx->s, status);
        }
    }
    set_request_connection(r, backend->connection);

    r = create_request_rec(ptemp, backend->connection, wctx->method);
    bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);

    if ((status = hc_send(r, wctx->req, bb)) != OK) {
@@ -942,6 +953,7 @@ static apr_status_t hc_watchdog_callback(int state, void *data,
                            baton = apr_palloc(ptemp, sizeof(baton_t));
                            baton->ctx = ctx;
                            baton->now = now;
                            baton->balancer = balancer;
                            baton->worker = worker;
                            baton->ptemp = ptemp;
                            baton->hc = hc_get_hcworker(ctx, worker, ptemp);