This is uglier than creating a subpool... :)

On Oct 17, 2013, at 12:10 PM, Yann Ylavic <ylavic....@gmail.com> wrote:

> Maybe using the following macros could help to log worker's (full) name when 
> no pool is available for ap_proxy_worker_name().
> 
> Regards,
> 
> Index: modules/proxy/mod_proxy.h
> ===================================================================
> --- modules/proxy/mod_proxy.h    (revision 1533127)
> +++ modules/proxy/mod_proxy.h    (working copy)
> @@ -328,6 +328,11 @@ do {                             \
>  (w)->s->io_buffer_size_set   = (c)->io_buffer_size_set;    \
>  } while (0)
>  
> +#define PROXY_WORKER_FMT "%s%s%s%s"
> +#define PROXY_WORKER_ARG(w) \
> +    *(w)->s->uds_path ? "unix" : "", (w)->s->uds_path, \
> +    *(w)->s->uds_path ?    "|" : "", (w)->s->name
> +
>  /* use 2 hashes */
>  typedef struct {
>      unsigned int def;
> Index: modules/proxy/mod_proxy.c
> ===================================================================
> --- modules/proxy/mod_proxy.c    (revision 1533127)
> +++ modules/proxy/mod_proxy.c    (working copy)
> @@ -1548,15 +1548,15 @@ static const char *
>          } else {
>              reuse = 1;
>              ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, 
> APLOGNO(01145)
> -                         "Sharing worker '%s' instead of creating new worker 
> '%s'",
> -                         ap_proxy_worker_name(cmd->pool, worker), new->real);
> +                         "Sharing worker '"PROXY_WORKER_FMT"' instead of 
> creating new worker '%s'",
> +                         PROXY_WORKER_ARG(worker), new->real);
>          }
>  
>          for (i = 0; i < arr->nelts; i++) {
>              if (reuse) {
>                  ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, 
> APLOGNO(01146)
> -                             "Ignoring parameter '%s=%s' for worker '%s' 
> because of worker sharing",
> -                             elts[i].key, elts[i].val, 
> ap_proxy_worker_name(cmd->pool, worker));
> +                             "Ignoring parameter '%s=%s' for worker 
> '"PROXY_WORKER_FMT"' because of worker sharing",
> +                             elts[i].key, elts[i].val, 
> PROXY_WORKER_ARG(worker));
>              } else {
>                  const char *err = set_worker_param(cmd->pool, worker, 
> elts[i].key,
>                                                     elts[i].val);
> @@ -2021,14 +2021,14 @@ static const char *add_member(cmd_parms *cmd, void
>          if ((err = ap_proxy_define_worker(cmd->pool, &worker, balancer, 
> conf, name, 0)) != NULL)
>              return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL);
>          ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, APLOGNO(01148)
> -                     "Defined worker '%s' for balancer '%s'",
> -                     ap_proxy_worker_name(cmd->pool, worker), 
> balancer->s->name);
> +                     "Defined worker '"PROXY_WORKER_FMT"' for balancer '%s'",
> +                     PROXY_WORKER_ARG(worker), balancer->s->name);
>          PROXY_COPY_CONF_PARAMS(worker, conf);
>      } else {
>          reuse = 1;
>          ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, APLOGNO(01149)
> -                     "Sharing worker '%s' instead of creating new worker 
> '%s'",
> -                     ap_proxy_worker_name(cmd->pool, worker), name);
> +                     "Sharing worker '"PROXY_WORKER_FMT"' instead of 
> creating new worker '%s'",
> +                     PROXY_WORKER_ARG(worker), name);
>      }
>  
>      arr = apr_table_elts(params);
> @@ -2036,8 +2036,8 @@ static const char *add_member(cmd_parms *cmd, void
>      for (i = 0; i < arr->nelts; i++) {
>          if (reuse) {
>              ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, 
> APLOGNO(01150)
> -                         "Ignoring parameter '%s=%s' for worker '%s' because 
> of worker sharing",
> -                         elts[i].key, elts[i].val, 
> ap_proxy_worker_name(cmd->pool, worker));
> +                         "Ignoring parameter '%s=%s' for worker 
> '"PROXY_WORKER_FMT"' because of worker sharing",
> +                         elts[i].key, elts[i].val, PROXY_WORKER_ARG(worker));
>          } else {
>              err = set_worker_param(cmd->pool, worker, elts[i].key,
>                                                 elts[i].val);
> Index: modules/proxy/mod_proxy_balancer.c
> ===================================================================
> --- modules/proxy/mod_proxy_balancer.c    (revision 1533127)
> +++ modules/proxy/mod_proxy_balancer.c    (working copy)
> @@ -118,8 +118,8 @@ static void init_balancer_members(apr_pool_t *p, s
>          int worker_is_initialized;
>          proxy_worker *worker = *workers;
>          ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(01158)
> -                     "Looking at %s -> %s initialized?", balancer->s->name,
> -                     ap_proxy_worker_name(p, worker));
> +                     "Looking at "PROXY_WORKER_FMT" -> %s initialized?", 
> balancer->s->name,
> +                     PROXY_WORKER_ARG(worker));
>          worker_is_initialized = PROXY_WORKER_IS_INITIALIZED(worker);
>          if (!worker_is_initialized) {
>              ap_proxy_initialize_worker(worker, s, p);
> @@ -639,10 +639,10 @@ static int proxy_balancer_post_request(proxy_worke
>              int val = ((int *)balancer->errstatuses->elts)[i];
>              if (r->status == val) {
>                  ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01174)
> -                              "%s: Forcing worker (%s) into error state "
> +                              "%s: Forcing worker ("PROXY_WORKER_FMT") into 
> error state "
>                                "due to status code %d matching 'failonstatus' 
> "
>                                "balancer parameter",
> -                              balancer->s->name, 
> ap_proxy_worker_name(r->pool, worker),
> +                              balancer->s->name, PROXY_WORKER_ARG(worker),
>                                val);
>                  worker->s->status |= PROXY_WORKER_IN_ERROR;
>                  worker->s->error_time = apr_time_now();
> @@ -654,9 +654,9 @@ static int proxy_balancer_post_request(proxy_worke
>      if (balancer->failontimeout
>          && (apr_table_get(r->notes, "proxy_timedout")) != NULL) {
>          ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02460)
> -                      "%s: Forcing worker (%s) into error state "
> +                      "%s: Forcing worker ("PROXY_WORKER_FMT") into error 
> state "
>                        "due to timeout and 'failonstatus' parameter being 
> set",
> -                       balancer->s->name, ap_proxy_worker_name(r->pool, 
> worker));
> +                       balancer->s->name, PROXY_WORKER_ARG(worker));
>          worker->s->status |= PROXY_WORKER_IN_ERROR;
>          worker->s->error_time = apr_time_now();
>  
> Index: modules/proxy/proxy_util.c
> ===================================================================
> --- modules/proxy/proxy_util.c    (revision 1533127)
> +++ modules/proxy/proxy_util.c    (working copy)
> @@ -1366,9 +1366,9 @@ static apr_status_t connection_cleanup(void *theco
>      /* Sanity check: Did we already return the pooled connection? */
>      if (conn->inreslist) {
>          ap_log_perror(APLOG_MARK, APLOG_ERR, 0, conn->pool, APLOGNO(00923)
> -                      "Pooled connection 0x%pp for worker %s has been"
> +                      "Pooled connection 0x%pp for worker "PROXY_WORKER_FMT" 
> has been"
>                        " already returned to the connection pool.", conn,
> -                      ap_proxy_worker_name(conn->pool, worker));
> +                      PROXY_WORKER_ARG(worker));
>          return APR_SUCCESS;
>      }
>  
> @@ -1501,14 +1501,6 @@ PROXY_DECLARE(char *) ap_proxy_worker_name(apr_poo
>      if (!(*worker->s->uds_path)) {
>          return worker->s->name;
>      }
> -    if (!pool) {
> -        /* ugly */
> -        apr_pool_create(&pool, ap_server_conf->process->pool);
> -        if (!pool) {
> -            /* something is better than nothing :) */
> -            return worker->s->name;
> -        }
> -    }
>      return apr_pstrcat(pool, "unix:", worker->s->uds_path, "|", 
> worker->s->name, NULL);
>  }
>  
> @@ -1742,8 +1734,8 @@ PROXY_DECLARE(apr_status_t) ap_proxy_share_worker(
>      worker->s = shm;
>      worker->s->index = i;
>      ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, APLOGNO(02338)
> -                 "%s shm[%d] (0x%pp) for worker: %s", action, i, (void *)shm,
> -                 ap_proxy_worker_name(NULL, worker));
> +                 "%s shm[%d] (0x%pp) for worker: "PROXY_WORKER_FMT, action,
> +                 i, (void *)shm, PROXY_WORKER_ARG(worker));
>      return APR_SUCCESS;
>  }
>  
> @@ -1755,13 +1747,13 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_wo
>      if (worker->s->status & PROXY_WORKER_INITIALIZED) {
>          /* The worker is already initialized */
>          ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(00924)
> -                     "worker %s shared already initialized",
> -                     ap_proxy_worker_name(p, worker));
> +                     "worker "PROXY_WORKER_FMT" shared already initialized",
> +                     PROXY_WORKER_ARG(worker));
>      }
>      else {
>          ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(00925)
> -                     "initializing worker %s shared",
> -                     ap_proxy_worker_name(p, worker));
> +                     "initializing worker "PROXY_WORKER_FMT" shared",
> +                     PROXY_WORKER_ARG(worker));
>          /* Set default parameters */
>          if (!worker->s->retry_set) {
>              worker->s->retry = apr_time_from_sec(PROXY_WORKER_DEFAULT_RETRY);
> @@ -1797,13 +1789,13 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_wo
>      /* What if local is init'ed and shm isn't?? Even possible? */
>      if (worker->local_status & PROXY_WORKER_INITIALIZED) {
>          ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(00926)
> -                     "worker %s local already initialized",
> -                     ap_proxy_worker_name(p, worker));
> +                     "worker "PROXY_WORKER_FMT" local already initialized",
> +                     PROXY_WORKER_ARG(worker));
>      }
>      else {
>          ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(00927)
> -                     "initializing worker %s local",
> -                     ap_proxy_worker_name(p, worker));
> +                     "initializing worker "PROXY_WORKER_FMT" local",
> +                     PROXY_WORKER_ARG(worker));
>          apr_global_mutex_lock(proxy_mutex);
>          /* Now init local worker data */
>          if (worker->tmutex == NULL) {
> @@ -1902,8 +1894,8 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_work
>          *worker = ap_proxy_get_worker(r->pool, NULL, conf, *url);
>          if (*worker) {
>              ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
> -                          "%s: found worker %s for %s",
> -                          (*worker)->s->scheme, (*worker)->s->name, *url);
> +                          "%s: found worker "PROXY_WORKER_FMT" for %s",
> +                          (*worker)->s->scheme, PROXY_WORKER_ARG(*worker), 
> *url);
>  
>              *balancer = NULL;
>              access_status = OK;
> @@ -2957,8 +2949,8 @@ PROXY_DECLARE(apr_status_t) ap_proxy_sync_balancer
>              if (worker->hash.def == shm->hash.def && worker->hash.fnv == 
> shm->hash.fnv) {
>                  found = 1;
>                  ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02402)
> -                             "re-grabbing shm[%d] (0x%pp) for worker: %s", 
> i, (void *)shm,
> -                             ap_proxy_worker_name(conf->pool, worker));
> +                             "re-grabbing shm[%d] (0x%pp) for worker: 
> "PROXY_WORKER_FMT,
> +                             i, (void *)shm, PROXY_WORKER_ARG(worker));
>                  break;
>              }
>          }
> [EOS]
> 
> 
> 
> On Thu, Oct 17, 2013 at 4:10 PM, <j...@apache.org> wrote:
> Author: jim
> Date: Thu Oct 17 14:10:43 2013
> New Revision: 1533087
> 
> URL: http://svn.apache.org/r1533087
> Log:
> Put the uds path in its own field, and adjust the logic
> to look for an empty string rather than a flag.
> 
> Modified:
>     httpd/httpd/trunk/modules/proxy/mod_proxy.h
>     httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c
>     httpd/httpd/trunk/modules/proxy/proxy_util.c
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1533087&r1=1533086&r2=1533087&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Thu Oct 17 14:10:43 2013
> @@ -342,6 +342,7 @@ typedef struct {
>      char      route[PROXY_WORKER_MAX_ROUTE_SIZE];     /* balancing route */
>      char      redirect[PROXY_WORKER_MAX_ROUTE_SIZE];  /* temporary balancing 
> redirection route */
>      char      flusher[PROXY_WORKER_MAX_SCHEME_SIZE];  /* flush provider used 
> by mod_proxy_fdpass */
> +    char      uds_path[PROXY_WORKER_MAX_NAME_SIZE];   /* path to worker's 
> unix domain socket if applicable */
>      int             lbset;      /* load balancer cluster set */
>      int             retries;    /* number of retries on this worker */
>      int             lbstatus;   /* Current lbstatus */
> @@ -388,7 +389,6 @@ typedef struct {
>      unsigned int     keepalive_set:1;
>      unsigned int     disablereuse_set:1;
>      unsigned int     was_malloced:1;
> -    unsigned int     uds:1;
>  } proxy_worker_shared;
> 
>  #define ALIGNED_PROXY_WORKER_SHARED_SIZE 
> (APR_ALIGN_DEFAULT(sizeof(proxy_worker_shared)))
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c?rev=1533087&r1=1533086&r2=1533087&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c Thu Oct 17 14:10:43 
> 2013
> @@ -1533,8 +1533,8 @@ static int balancer_handler(request_rec
>                            ap_escape_uri(r->pool, worker->s->name),
>                            "&nonce=", balancer->s->nonce,
>                            "\">", NULL);
> -                ap_rvputs(r, (worker->s->uds ? "<i>" : ""), 
> ap_proxy_worker_name(r->pool, worker),
> -                          (worker->s->uds ? "</i>" : ""), "</a></td>", NULL);
> +                ap_rvputs(r, (*worker->s->uds_path ? "<i>" : ""), 
> ap_proxy_worker_name(r->pool, worker),
> +                          (*worker->s->uds_path ? "</i>" : ""), "</a></td>", 
> NULL);
>                  ap_rvputs(r, "<td>", ap_escape_html(r->pool, 
> worker->s->route),
>                            NULL);
>                  ap_rvputs(r, "</td><td>",
> @@ -1559,7 +1559,7 @@ static int balancer_handler(request_rec
>          ap_rputs("<hr />\n", r);
>          if (wsel && bsel) {
>              ap_rputs("<h3>Edit worker settings for ", r);
> -            ap_rvputs(r, (wsel->s->uds?"<i>":""), 
> ap_proxy_worker_name(r->pool, wsel), (wsel->s->uds?"</i>":""), "</h3>\n", 
> NULL);
> +            ap_rvputs(r, (*wsel->s->uds_path?"<i>":""), 
> ap_proxy_worker_name(r->pool, wsel), (*wsel->s->uds_path?"</i>":""), 
> "</h3>\n", NULL);
>              ap_rputs("<form method=\"POST\" 
> enctype=\"application/x-www-form-urlencoded\" action=\"", r);
>              ap_rvputs(r, ap_escape_uri(r->pool, action), "\">\n", NULL);
>              ap_rputs("<dl>\n<table><tr><td>Load factor:</td><td><input 
> name='w_lf' id='w_lf' type=text ", r);
> 
> Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1533087&r1=1533086&r2=1533087&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
> +++ httpd/httpd/trunk/modules/proxy/proxy_util.c Thu Oct 17 14:10:43 2013
> @@ -1493,7 +1493,7 @@ PROXY_DECLARE(char *) ap_proxy_worker_na
>      int rv;
>      apr_uri_t uri;
>      apr_pool_t *pool = p;
> -    if (!worker->s->uds) {
> +    if (!(*worker->s->uds_path)) {
>          return worker->s->name;
>      }
>      if (!pool) {
> @@ -1504,11 +1504,7 @@ PROXY_DECLARE(char *) ap_proxy_worker_na
>              return worker->s->name;
>          }
>      }
> -    rv = apr_uri_parse(pool, worker->s->name, &uri);
> -    if (rv != APR_SUCCESS) {
> -        return apr_pstrcat(pool, worker->s->name, "|", NULL);
> -    }
> -    return apr_pstrcat(pool, "unix:", uri.path, "|", uri.scheme, ":", NULL);
> +    return apr_pstrcat(pool, "unix:", worker->s->uds_path, "|", 
> worker->s->name, NULL);
>  }
> 
>  PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
> @@ -1609,16 +1605,17 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
>      proxy_worker_shared *wshared;
>      char *ptr, *sockpath = NULL;
> 
> -    /* Look to see if we are using UDS:
> -       require format: unix:/path/foo/bar.sock|http:
> -       This results in talking http to the socket at /path/foo/bar.sock
> -    */
> +    /*
> +     * Look to see if we are using UDS:
> +     * require format: unix:/path/foo/bar.sock|http://ignored/path2/
> +     * This results in talking http to the socket at /path/foo/bar.sock
> +     */
>      ptr = ap_strchr((char *)url, '|');
>      if (ptr) {
>          *ptr = '\0';
>          rv = apr_uri_parse(p, url, &urisock);
>          if (rv == APR_SUCCESS && !strcasecmp(urisock.scheme, "unix")) {
> -            sockpath = urisock.path;
> +            sockpath = ap_runtime_dir_relative(p, urisock.path);;
>              url = ptr+1;    /* so we get the scheme for the uds */
>          }
>          else {
> @@ -1633,16 +1630,13 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
>      if (!uri.scheme) {
>          return apr_pstrcat(p, "URL must be absolute!: ", url, NULL);
>      }
> -    /* allow for http:|sock:/path */
> +    /* allow for unix:/path|http: */
>      if (!uri.hostname && !sockpath) {
>          return apr_pstrcat(p, "URL must be absolute!: ", url, NULL);;
>      }
> 
>      if (sockpath) {
>          uri.hostname = "localhost";
> -        uri.path = ap_runtime_dir_relative(p, sockpath);
> -        uri.query = NULL;
> -        uri.fragment = NULL;
>      }
>      else {
>          ap_str_tolower(uri.hostname);
> @@ -1702,7 +1696,15 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
>      wshared->hash.def = ap_proxy_hashfunc(wshared->name, 
> PROXY_HASHFUNC_DEFAULT);
>      wshared->hash.fnv = ap_proxy_hashfunc(wshared->name, PROXY_HASHFUNC_FNV);
>      wshared->was_malloced = (do_malloc != 0);
> -    wshared->uds = (sockpath != NULL);
> +    if (sockpath) {
> +        if (PROXY_STRNCPY(wshared->uds_path, sockpath) != APR_SUCCESS) {
> +            return apr_psprintf(p, "worker uds path (%s) too long", 
> sockpath);
> +        }
> +
> +    }
> +    else {
> +        *wshared->uds_path = '\0';
> +    }
> 
>      (*worker)->hash = wshared->hash;
>      (*worker)->context = NULL;
> @@ -2087,12 +2089,9 @@ PROXY_DECLARE(int) ap_proxy_acquire_conn
>      (*conn)->close  = 0;
>      (*conn)->inreslist = 0;
> 
> -    if (worker->s->uds) {
> +    if (*worker->s->uds_path) {
>          if ((*conn)->uds_path == NULL) {
> -            apr_uri_t puri;
> -            if (apr_uri_parse(worker->cp->pool, worker->s->name, &puri) == 
> APR_SUCCESS) {
> -                (*conn)->uds_path = apr_pstrdup(worker->cp->pool, puri.path);
> -            }
> +            (*conn)->uds_path = apr_pstrdup(worker->cp->pool, 
> worker->s->uds_path);
>          }
>          if ((*conn)->uds_path) {
>              ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02545)
> @@ -2100,9 +2099,10 @@ PROXY_DECLARE(int) ap_proxy_acquire_conn
>                           proxy_function, (*conn)->uds_path);
>          }
>          else {
> +            /* should never happen */
>              ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02546)
> -                         "%s: cannot parse for UDS (%s)",
> -                         proxy_function, worker->s->name);
> +                         "%s: cannot determine UDS (%s)",
> +                         proxy_function, worker->s->uds_path);
> 
>          }
>      }
> @@ -2182,7 +2182,7 @@ ap_proxy_determine_connection(apr_pool_t
>       *      spilling the cached addr from the worker.
>       */
>      if (!conn->hostname || !worker->s->is_address_reusable ||
> -        worker->s->disablereuse || worker->s->uds) {
> +        worker->s->disablereuse || *worker->s->uds_path) {
>          if (proxyname) {
>              conn->hostname = apr_pstrdup(conn->pool, proxyname);
>              conn->port = proxyport;
> @@ -2220,7 +2220,7 @@ ap_proxy_determine_connection(apr_pool_t
>              conn->port = uri->port;
>          }
>          socket_cleanup(conn);
> -        if (!worker->s->uds && worker->s->is_address_reusable && 
> !worker->s->disablereuse) {
> +        if (!(*worker->s->uds_path) && worker->s->is_address_reusable && 
> !worker->s->disablereuse) {
>              /*
>               * Only do a lookup if we should not reuse the backend address.
>               * Otherwise we will look it up once for the worker.
> @@ -2231,7 +2231,7 @@ ap_proxy_determine_connection(apr_pool_t
>                                          conn->pool);
>          }
>      }
> -    if (!worker->s->uds && worker->s->is_address_reusable && 
> !worker->s->disablereuse) {
> +    if (!(*worker->s->uds_path) && worker->s->is_address_reusable && 
> !worker->s->disablereuse) {
>          /*
>           * Looking up the backend address for the worker only makes sense if
>           * we can reuse the address.
> 
> 
> 
> <httpd-trunk-mod_proxy_WORKER_FMT_ARG.patch>

Reply via email to