You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by jk...@apache.org on 2014/07/11 12:36:15 UTC

svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Author: jkaluza
Date: Fri Jul 11 10:36:15 2014
New Revision: 1609680

URL: http://svn.apache.org/r1609680
Log:
mod_proxy: add ap_proxy_define_match_worker() and use it for ProxyPassMatch
and ProxyMatch section to distinguish between normal workers and workers
with regex substitutions in the name. Implement handling of such workers
in ap_proxy_get_worker(). PR 43513

Modified:
    httpd/httpd/trunk/modules/proxy/mod_proxy.c
    httpd/httpd/trunk/modules/proxy/mod_proxy.h
    httpd/httpd/trunk/modules/proxy/proxy_util.c

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1609680&r1=1609679&r2=1609680&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Jul 11 10:36:15 2014
@@ -1647,15 +1647,30 @@ static const char *
         new->balancer = balancer;
     }
     else {
-        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, de_socketfy(cmd->pool, r));
+        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, new->real);
         int reuse = 0;
         if (!worker) {
-            const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0);
+            const char *err;
+            if (use_regex) {
+                err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
+                                                   conf, r, 0);
+            }
+            else {
+                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
+                                             conf, r, 0);
+            }
             if (err)
                 return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
 
             PROXY_COPY_CONF_PARAMS(worker, conf);
-        } else {
+        }
+        else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {
+            return apr_pstrcat(cmd->temp_pool, "ProxyPass/<Proxy> and "
+                               "ProxyPassMatch/<ProxyMatch> can't be used "
+                               "altogether with the same worker name ",
+                               "(", worker->s->name, ")", NULL);
+        }
+        else {
             reuse = 1;
             ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, APLOGNO(01145)
                          "Sharing worker '%s' instead of creating new worker '%s'",
@@ -2270,6 +2285,7 @@ static const char *proxysection(cmd_parm
     char *word, *val;
     proxy_balancer *balancer = NULL;
     proxy_worker *worker = NULL;
+    int use_regex = 0;
 
     const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE);
     proxy_server_conf *sconf =
@@ -2308,6 +2324,7 @@ static const char *proxysection(cmd_parm
         if (!r) {
             return "Regex could not be compiled";
         }
+        use_regex = 1;
     }
 
     /* initialize our config and fetch it */
@@ -2354,12 +2371,24 @@ static const char *proxysection(cmd_parm
             worker = ap_proxy_get_worker(cmd->temp_pool, NULL, sconf,
                                          de_socketfy(cmd->temp_pool, (char*)conf->p));
             if (!worker) {
-                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
-                                          sconf, conf->p, 0);
+                if (use_regex) {
+                    err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
+                                                       sconf, conf->p, 0);
+                }
+                else {
+                    err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
+                                                 sconf, conf->p, 0);
+                }
                 if (err)
                     return apr_pstrcat(cmd->temp_pool, thiscmd->name,
                                        " ", err, NULL);
             }
+            else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {
+                return apr_pstrcat(cmd->temp_pool, "ProxyPass/<Proxy> and "
+                                   "ProxyPassMatch/<ProxyMatch> can't be used "
+                                   "altogether with the same worker name ",
+                                   "(", worker->s->name, ")", NULL);
+            }
         }
         if (worker == NULL && balancer == NULL) {
             return apr_pstrcat(cmd->pool, thiscmd->name,

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1609680&r1=1609679&r2=1609680&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Fri Jul 11 10:36:15 2014
@@ -398,6 +398,7 @@ typedef struct {
     unsigned int     keepalive_set:1;
     unsigned int     disablereuse_set:1;
     unsigned int     was_malloced:1;
+    unsigned int     is_name_matchable:1;
 } proxy_worker_shared;
 
 #define ALIGNED_PROXY_WORKER_SHARED_SIZE (APR_ALIGN_DEFAULT(sizeof(proxy_worker_shared)))
@@ -645,6 +646,24 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
                                              int do_malloc);
 
 /**
+ * Define and Allocate space for the ap_strcmp_match()able worker to proxy
+ * configuration.
+ * @param p         memory pool to allocate worker from
+ * @param worker    the new worker
+ * @param balancer  the balancer that the worker belongs to
+ * @param conf      current proxy server configuration
+ * @param url       url containing worker name (produces match pattern)
+ * @param do_malloc true if shared struct should be malloced
+ * @return          error message or NULL if successful (*worker is new worker)
+ */
+PROXY_DECLARE(char *) ap_proxy_define_match_worker(apr_pool_t *p,
+                                             proxy_worker **worker,
+                                             proxy_balancer *balancer,
+                                             proxy_server_conf *conf,
+                                             const char *url,
+                                             int do_malloc);
+
+/**
  * Share a defined proxy worker via shm
  * @param worker  worker to be shared
  * @param shm     location of shared info

Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1609680&r1=1609679&r2=1609680&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Fri Jul 11 10:36:15 2014
@@ -1509,6 +1509,44 @@ PROXY_DECLARE(char *) ap_proxy_worker_na
     return apr_pstrcat(p, "unix:", worker->s->uds_path, "|", worker->s->name, NULL);
 }
 
+/*
+ * Taken from ap_strcmp_match() :
+ * Match = 0, NoMatch = 1, Abort = -1, Inval = -2
+ * Based loosely on sections of wildmat.c by Rich Salz
+ * Hmmm... shouldn't this really go component by component?
+ *
+ * Adds handling of the "\<any>" => "<any>" unescaping.
+ */
+static int ap_proxy_strcmp_ematch(const char *str, const char *expected)
+{
+    apr_size_t x, y;
+
+    for (x = 0, y = 0; expected[y]; ++y, ++x) {
+        if ((!str[x]) && (expected[y] != '$' || !apr_isdigit(expected[y + 1])))
+            return -1;
+        if (expected[y] == '$' && apr_isdigit(expected[y + 1])) {
+            while (expected[y] == '$' && apr_isdigit(expected[y + 1]))
+                y += 2;
+            if (!expected[y])
+                return 0;
+            while (str[x]) {
+                int ret;
+                if ((ret = ap_proxy_strcmp_ematch(&str[x++], &expected[y])) != 1)
+                    return ret;
+            }
+            return -1;
+        }
+        else if (expected[y] == '\\') {
+            /* NUL is an invalid char! */
+            if (!expected[++y])
+                return -2;
+        }
+        if (str[x] != expected[y])
+            return 1;
+    }
+    return (str[x] != '\0');
+}
+
 PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
                                                   proxy_balancer *balancer,
                                                   proxy_server_conf *conf,
@@ -1569,11 +1607,15 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_g
             if ( ((worker_name_length = strlen(worker->s->name)) <= url_length)
                 && (worker_name_length >= min_match)
                 && (worker_name_length > max_match)
-                && (strncmp(url_copy, worker->s->name, worker_name_length) == 0) ) {
+                && (worker->s->is_name_matchable
+                    || strncmp(url_copy, worker->s->name,
+                               worker_name_length) == 0)
+                && (!worker->s->is_name_matchable
+                    || ap_proxy_strcmp_ematch(url_copy,
+                                              worker->s->name) == 0) ) {
                 max_worker = worker;
                 max_match = worker_name_length;
             }
-
         }
     } else {
         worker = (proxy_worker *)conf->workers->elts;
@@ -1581,7 +1623,12 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_g
             if ( ((worker_name_length = strlen(worker->s->name)) <= url_length)
                 && (worker_name_length >= min_match)
                 && (worker_name_length > max_match)
-                && (strncmp(url_copy, worker->s->name, worker_name_length) == 0) ) {
+                && (worker->s->is_name_matchable
+                    || strncmp(url_copy, worker->s->name,
+                               worker_name_length) == 0)
+                && (!worker->s->is_name_matchable
+                    || ap_proxy_strcmp_ematch(url_copy,
+                                              worker->s->name) == 0) ) {
                 max_worker = worker;
                 max_match = worker_name_length;
             }
@@ -1703,6 +1750,7 @@ 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->is_name_matchable = 0;
     if (sockpath) {
         if (PROXY_STRNCPY(wshared->uds_path, sockpath) != APR_SUCCESS) {
             return apr_psprintf(p, "worker uds path (%s) too long", sockpath);
@@ -1722,6 +1770,24 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
     return NULL;
 }
 
+PROXY_DECLARE(char *) ap_proxy_define_match_worker(apr_pool_t *p,
+                                             proxy_worker **worker,
+                                             proxy_balancer *balancer,
+                                             proxy_server_conf *conf,
+                                             const char *url,
+                                             int do_malloc)
+{
+    char *err;
+
+    err = ap_proxy_define_worker(p, worker, balancer, conf, url, do_malloc);
+    if (err) {
+        return err;
+    }
+
+    (*worker)->s->is_name_matchable = 1;
+    return NULL;
+}
+
 /*
  * Create an already defined worker and free up memory
  */



Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Jan Kaluža <jk...@redhat.com>.
On 07/11/2014 12:59 PM, Yann Ylavic wrote:
> On Fri, Jul 11, 2014 at 12:36 PM,  <jk...@apache.org> wrote:
>> Author: jkaluza
>> Date: Fri Jul 11 10:36:15 2014
>> New Revision: 1609680
>>
>> URL: http://svn.apache.org/r1609680
>> Log:
>> mod_proxy: add ap_proxy_define_match_worker() and use it for ProxyPassMatch
>> and ProxyMatch section to distinguish between normal workers and workers
>> with regex substitutions in the name. Implement handling of such workers
>> in ap_proxy_get_worker(). PR 43513
>>
> [...]
>> --- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
>> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Jul 11 10:36:15 2014
>> @@ -1647,15 +1647,30 @@ static const char *
>>           new->balancer = balancer;
>>       }
>>       else {
>> -        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, de_socketfy(cmd->pool, r));
>> +        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, new->real);
>>           int reuse = 0;
>>           if (!worker) {
>> -            const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0);
>> +            const char *err;
>> +            if (use_regex) {
>> +                err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
>> +                                                   conf, r, 0);
>> +            }
>> +            else {
>> +                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
>> +                                             conf, r, 0);
>> +            }
>>               if (err)
>>                   return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
>>
>>               PROXY_COPY_CONF_PARAMS(worker, conf);
>> -        } else {
>> +        }
>> +        else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {
>
> Maybe (worker->s->is_name_matchable != 0)?

Done in r1609688. Thanks.

>> +            return apr_pstrcat(cmd->temp_pool, "ProxyPass/<Proxy> and "
>> +                               "ProxyPassMatch/<ProxyMatch> can't be used "
>> +                               "altogether with the same worker name ",
>> +                               "(", worker->s->name, ")", NULL);
>> +        }
>> +        else {
>>               reuse = 1;
>>               ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, APLOGNO(01145)
>>                            "Sharing worker '%s' instead of creating new worker '%s'",
> [...]
>> @@ -2354,12 +2371,24 @@ static const char *proxysection(cmd_parm
>>               worker = ap_proxy_get_worker(cmd->temp_pool, NULL, sconf,
>>                                            de_socketfy(cmd->temp_pool, (char*)conf->p));
>>               if (!worker) {
>> -                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
>> -                                          sconf, conf->p, 0);
>> +                if (use_regex) {
>> +                    err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
>> +                                                       sconf, conf->p, 0);
>> +                }
>> +                else {
>> +                    err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
>> +                                                 sconf, conf->p, 0);
>> +                }
>>                   if (err)
>>                       return apr_pstrcat(cmd->temp_pool, thiscmd->name,
>>                                          " ", err, NULL);
>>               }
>> +            else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {
>
> Likewise?
>
>> +                return apr_pstrcat(cmd->temp_pool, "ProxyPass/<Proxy> and "
>> +                                   "ProxyPassMatch/<ProxyMatch> can't be used "
>> +                                   "altogether with the same worker name ",
>> +                                   "(", worker->s->name, ")", NULL);
>> +            }


Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Yann Ylavic <yl...@gmail.com>.
On Fri, Jul 11, 2014 at 12:36 PM,  <jk...@apache.org> wrote:
> Author: jkaluza
> Date: Fri Jul 11 10:36:15 2014
> New Revision: 1609680
>
> URL: http://svn.apache.org/r1609680
> Log:
> mod_proxy: add ap_proxy_define_match_worker() and use it for ProxyPassMatch
> and ProxyMatch section to distinguish between normal workers and workers
> with regex substitutions in the name. Implement handling of such workers
> in ap_proxy_get_worker(). PR 43513
>
[...]
> --- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Jul 11 10:36:15 2014
> @@ -1647,15 +1647,30 @@ static const char *
>          new->balancer = balancer;
>      }
>      else {
> -        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, de_socketfy(cmd->pool, r));
> +        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, new->real);
>          int reuse = 0;
>          if (!worker) {
> -            const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0);
> +            const char *err;
> +            if (use_regex) {
> +                err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
> +                                                   conf, r, 0);
> +            }
> +            else {
> +                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
> +                                             conf, r, 0);
> +            }
>              if (err)
>                  return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
>
>              PROXY_COPY_CONF_PARAMS(worker, conf);
> -        } else {
> +        }
> +        else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {

Maybe (worker->s->is_name_matchable != 0)?

> +            return apr_pstrcat(cmd->temp_pool, "ProxyPass/<Proxy> and "
> +                               "ProxyPassMatch/<ProxyMatch> can't be used "
> +                               "altogether with the same worker name ",
> +                               "(", worker->s->name, ")", NULL);
> +        }
> +        else {
>              reuse = 1;
>              ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server, APLOGNO(01145)
>                           "Sharing worker '%s' instead of creating new worker '%s'",
[...]
> @@ -2354,12 +2371,24 @@ static const char *proxysection(cmd_parm
>              worker = ap_proxy_get_worker(cmd->temp_pool, NULL, sconf,
>                                           de_socketfy(cmd->temp_pool, (char*)conf->p));
>              if (!worker) {
> -                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
> -                                          sconf, conf->p, 0);
> +                if (use_regex) {
> +                    err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
> +                                                       sconf, conf->p, 0);
> +                }
> +                else {
> +                    err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
> +                                                 sconf, conf->p, 0);
> +                }
>                  if (err)
>                      return apr_pstrcat(cmd->temp_pool, thiscmd->name,
>                                         " ", err, NULL);
>              }
> +            else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {

Likewise?

> +                return apr_pstrcat(cmd->temp_pool, "ProxyPass/<Proxy> and "
> +                                   "ProxyPassMatch/<ProxyMatch> can't be used "
> +                                   "altogether with the same worker name ",
> +                                   "(", worker->s->name, ")", NULL);
> +            }

Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Jan Kaluža <jk...@redhat.com>.
On 07/11/2014 01:38 PM, Jim Jagielski wrote:
>
> On Jul 11, 2014, at 6:36 AM, jkaluza@apache.org wrote:
>
>> Author: jkaluza
>> Date: Fri Jul 11 10:36:15 2014
>> New Revision: 1609680
>>
>> URL: http://svn.apache.org/r1609680
>> Log:
>> mod_proxy: add ap_proxy_define_match_worker() and use it for ProxyPassMatch
>> and ProxyMatch section to distinguish between normal workers and workers
>> with regex substitutions in the name. Implement handling of such workers
>> in ap_proxy_get_worker(). PR 43513
>>
>> Modified:
>>     httpd/httpd/trunk/modules/proxy/mod_proxy.c
>>     httpd/httpd/trunk/modules/proxy/mod_proxy.h
>>     httpd/httpd/trunk/modules/proxy/proxy_util.c
>>
>> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1609680&r1=1609679&r2=1609680&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
>> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Jul 11 10:36:15 2014
>> @@ -1647,15 +1647,30 @@ static const char *
>>          new->balancer = balancer;
>>      }
>>      else {
>> -        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, de_socketfy(cmd->pool, r));
>> +        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, new->real);
>
> Why do we no longer de_socketfy? Looks like this breaks UDS.

This should be ok, because new->real is already de_socketfy-ied (see 
line 1601)

http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?revision=1609688&view=markup#l1601

>>          int reuse = 0;
>>          if (!worker) {
>> -            const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0);
>> +            const char *err;
>> +            if (use_regex) {
>> +                err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
>> +                                                   conf, r, 0);
>> +            }
>> +            else {
>> +                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
>> +                                             conf, r, 0);
>> +            }
>>              if (err)
>>                  return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
>>
>>              PROXY_COPY_CONF_PARAMS(worker, conf);
>> -        } else {
>> +        }
>> +        else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {
>
> Minor nit: I always disliked using bitwise xor for boolean xor :/

That's from Yann's part of the patch, but I can change it if needed.

> We need an mmn bump.
>

Will do it in next commit.

Regards,
Jan Kaluza


Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Jim Jagielski <ji...@jaguNET.com>.
On Jul 11, 2014, at 6:36 AM, jkaluza@apache.org wrote:

> Author: jkaluza
> Date: Fri Jul 11 10:36:15 2014
> New Revision: 1609680
> 
> URL: http://svn.apache.org/r1609680
> Log:
> mod_proxy: add ap_proxy_define_match_worker() and use it for ProxyPassMatch
> and ProxyMatch section to distinguish between normal workers and workers
> with regex substitutions in the name. Implement handling of such workers
> in ap_proxy_get_worker(). PR 43513
> 
> Modified:
>    httpd/httpd/trunk/modules/proxy/mod_proxy.c
>    httpd/httpd/trunk/modules/proxy/mod_proxy.h
>    httpd/httpd/trunk/modules/proxy/proxy_util.c
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1609680&r1=1609679&r2=1609680&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Jul 11 10:36:15 2014
> @@ -1647,15 +1647,30 @@ static const char *
>         new->balancer = balancer;
>     }
>     else {
> -        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, de_socketfy(cmd->pool, r));
> +        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, new->real);

Why do we no longer de_socketfy? Looks like this breaks UDS.

>         int reuse = 0;
>         if (!worker) {
> -            const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0);
> +            const char *err;
> +            if (use_regex) {
> +                err = ap_proxy_define_match_worker(cmd->pool, &worker, NULL,
> +                                                   conf, r, 0);
> +            }
> +            else {
> +                err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
> +                                             conf, r, 0);
> +            }
>             if (err)
>                 return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
> 
>             PROXY_COPY_CONF_PARAMS(worker, conf);
> -        } else {
> +        }
> +        else if ((use_regex != 0) ^ (worker->s->is_name_matchable)) {

Minor nit: I always disliked using bitwise xor for boolean xor :/

We need an mmn bump.


Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Jan Kaluža <jk...@redhat.com>.
On 11/24/2014 03:59 AM, Eric Covener wrote:
> On Sun, Nov 23, 2014 at 9:57 PM, Eric Covener <co...@gmail.com> wrote:
>> On Fri, Jul 11, 2014 at 6:36 AM,  <jk...@apache.org> wrote:
>>> static int ap_proxy_strcmp_ematch(const char *str, const char *expected)
>>> +{
>>> +    apr_size_t x, y;
>>> +
>>> +    for (x = 0, y = 0; expected[y]; ++y, ++x) {
>>> +        if ((!str[x]) && (expected[y] != '
>>> || !apr_isdigit(expected[y + 1])))
>>> +            return -1;
>>> +        if (expected[y] == ' && apr_isdigit(expected[y + 1])) {
>>> +            while (expected[y] == ' && apr_isdigit(expected[y + 1]))
>>> +                y += 2;
>>> +            if (!expected[y])
>>> +                return 0;
>>> +            while (str[x]) {
>>> +                int ret;
>>> +                if ((ret = ap_proxy_strcmp_ematch(&str[x++], &expected[y])) != 1)
>>> +                    return ret;
>>> +            }
>>> +            return -1;
>>> +        }
>>> +        else if (expected[y] == '\\') {
>>> +            /* NUL is an invalid char! */
>>> +            if (!expected[++y])
>>> +                return -2;
>>> +        }
>>> +        if (str[x] != expected[y])
>>> +            return 1;
>>> +    }
>>> +    return (str[x] != '\0');
>>> +}
>>
>
> Sorry, stray keystroke (tab?) made gmail send early.
>
> This is breaking the common PHP-FPM recipes using unix domain sockets
> in trunk e.g.
>
>      ProxyPassMatch ^/info.php$
> "unix:/var/run/php5-fpm.sock|fcgi://localhost/home/covener/SRC/httpd-trunk/built/htdocs/"
>
> The old test accepted the worker URL being a prefix of the worker:
>
>      strncmp(url_copy, worker->s->name, worker_name_length) == 0)
>
> but now that doesn't happen for ProxyPassMatch.  This seems to be
> due to the last return expecting str[x] to have been totally consumed
> by the expected (worker) string.
>
>

Conflict discovered in file 'proxy/proxy_util.c'.

^ You were faster, thanks for fixing this issue :).

Regards,
Jan Kaluza


Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Jim Jagielski <ji...@jaguNET.com>.
+1
> On Nov 27, 2014, at 11:51 AM, Yann Ylavic <yl...@gmail.com> wrote:
> 
> On Thu, Nov 27, 2014 at 12:36 PM, Jan Kaluža <jk...@redhat.com> wrote:
>> On 11/24/2014 01:37 PM, Eric Covener wrote:
>>> 
>>> please check r1641381
>> 
>> 
>> Anyone against proposing r1609680 (commit from the subject) + r1641381 for
>> 2.4.x?
> 
> +1
> 
> Thanks,
> Yann.


Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Yann Ylavic <yl...@gmail.com>.
On Thu, Nov 27, 2014 at 12:36 PM, Jan Kaluža <jk...@redhat.com> wrote:
> On 11/24/2014 01:37 PM, Eric Covener wrote:
>>
>> please check r1641381
>
>
> Anyone against proposing r1609680 (commit from the subject) + r1641381 for
> 2.4.x?

+1

Thanks,
Yann.

Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Jan Kaluža <jk...@redhat.com>.
On 11/24/2014 01:37 PM, Eric Covener wrote:
> please check r1641381

Anyone against proposing r1609680 (commit from the subject) + r1641381 
for 2.4.x?

Regards,
Jan Kaluza

> On Sun, Nov 23, 2014 at 9:59 PM, Eric Covener <co...@gmail.com> wrote:
>> On Sun, Nov 23, 2014 at 9:57 PM, Eric Covener <co...@gmail.com> wrote:
>>> On Fri, Jul 11, 2014 at 6:36 AM,  <jk...@apache.org> wrote:
>>>> static int ap_proxy_strcmp_ematch(const char *str, const char *expected)
>>>> +{
>>>> +    apr_size_t x, y;
>>>> +
>>>> +    for (x = 0, y = 0; expected[y]; ++y, ++x) {
>>>> +        if ((!str[x]) && (expected[y] != '
>>>> || !apr_isdigit(expected[y + 1])))
>>>> +            return -1;
>>>> +        if (expected[y] == ' && apr_isdigit(expected[y + 1])) {
>>>> +            while (expected[y] == ' && apr_isdigit(expected[y + 1]))
>>>> +                y += 2;
>>>> +            if (!expected[y])
>>>> +                return 0;
>>>> +            while (str[x]) {
>>>> +                int ret;
>>>> +                if ((ret = ap_proxy_strcmp_ematch(&str[x++], &expected[y])) != 1)
>>>> +                    return ret;
>>>> +            }
>>>> +            return -1;
>>>> +        }
>>>> +        else if (expected[y] == '\\') {
>>>> +            /* NUL is an invalid char! */
>>>> +            if (!expected[++y])
>>>> +                return -2;
>>>> +        }
>>>> +        if (str[x] != expected[y])
>>>> +            return 1;
>>>> +    }
>>>> +    return (str[x] != '\0');
>>>> +}
>>>
>>
>> Sorry, stray keystroke (tab?) made gmail send early.
>>
>> This is breaking the common PHP-FPM recipes using unix domain sockets
>> in trunk e.g.
>>
>>      ProxyPassMatch ^/info.php$
>> "unix:/var/run/php5-fpm.sock|fcgi://localhost/home/covener/SRC/httpd-trunk/built/htdocs/"
>>
>> The old test accepted the worker URL being a prefix of the worker:
>>
>>      strncmp(url_copy, worker->s->name, worker_name_length) == 0)
>>
>> but now that doesn't happen for ProxyPassMatch.  This seems to be
>> due to the last return expecting str[x] to have been totally consumed
>> by the expected (worker) string.
>>
>>
>> --
>> Eric Covener
>> covener@gmail.com
>
>
>


Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Eric Covener <co...@gmail.com>.
please check r1641381

On Sun, Nov 23, 2014 at 9:59 PM, Eric Covener <co...@gmail.com> wrote:
> On Sun, Nov 23, 2014 at 9:57 PM, Eric Covener <co...@gmail.com> wrote:
>> On Fri, Jul 11, 2014 at 6:36 AM,  <jk...@apache.org> wrote:
>>> static int ap_proxy_strcmp_ematch(const char *str, const char *expected)
>>> +{
>>> +    apr_size_t x, y;
>>> +
>>> +    for (x = 0, y = 0; expected[y]; ++y, ++x) {
>>> +        if ((!str[x]) && (expected[y] != '
>>> || !apr_isdigit(expected[y + 1])))
>>> +            return -1;
>>> +        if (expected[y] == ' && apr_isdigit(expected[y + 1])) {
>>> +            while (expected[y] == ' && apr_isdigit(expected[y + 1]))
>>> +                y += 2;
>>> +            if (!expected[y])
>>> +                return 0;
>>> +            while (str[x]) {
>>> +                int ret;
>>> +                if ((ret = ap_proxy_strcmp_ematch(&str[x++], &expected[y])) != 1)
>>> +                    return ret;
>>> +            }
>>> +            return -1;
>>> +        }
>>> +        else if (expected[y] == '\\') {
>>> +            /* NUL is an invalid char! */
>>> +            if (!expected[++y])
>>> +                return -2;
>>> +        }
>>> +        if (str[x] != expected[y])
>>> +            return 1;
>>> +    }
>>> +    return (str[x] != '\0');
>>> +}
>>
>
> Sorry, stray keystroke (tab?) made gmail send early.
>
> This is breaking the common PHP-FPM recipes using unix domain sockets
> in trunk e.g.
>
>     ProxyPassMatch ^/info.php$
> "unix:/var/run/php5-fpm.sock|fcgi://localhost/home/covener/SRC/httpd-trunk/built/htdocs/"
>
> The old test accepted the worker URL being a prefix of the worker:
>
>     strncmp(url_copy, worker->s->name, worker_name_length) == 0)
>
> but now that doesn't happen for ProxyPassMatch.  This seems to be
> due to the last return expecting str[x] to have been totally consumed
> by the expected (worker) string.
>
>
> --
> Eric Covener
> covener@gmail.com



-- 
Eric Covener
covener@gmail.com

Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Eric Covener <co...@gmail.com>.
On Sun, Nov 23, 2014 at 9:57 PM, Eric Covener <co...@gmail.com> wrote:
> On Fri, Jul 11, 2014 at 6:36 AM,  <jk...@apache.org> wrote:
>> static int ap_proxy_strcmp_ematch(const char *str, const char *expected)
>> +{
>> +    apr_size_t x, y;
>> +
>> +    for (x = 0, y = 0; expected[y]; ++y, ++x) {
>> +        if ((!str[x]) && (expected[y] != '
>> || !apr_isdigit(expected[y + 1])))
>> +            return -1;
>> +        if (expected[y] == ' && apr_isdigit(expected[y + 1])) {
>> +            while (expected[y] == ' && apr_isdigit(expected[y + 1]))
>> +                y += 2;
>> +            if (!expected[y])
>> +                return 0;
>> +            while (str[x]) {
>> +                int ret;
>> +                if ((ret = ap_proxy_strcmp_ematch(&str[x++], &expected[y])) != 1)
>> +                    return ret;
>> +            }
>> +            return -1;
>> +        }
>> +        else if (expected[y] == '\\') {
>> +            /* NUL is an invalid char! */
>> +            if (!expected[++y])
>> +                return -2;
>> +        }
>> +        if (str[x] != expected[y])
>> +            return 1;
>> +    }
>> +    return (str[x] != '\0');
>> +}
>

Sorry, stray keystroke (tab?) made gmail send early.

This is breaking the common PHP-FPM recipes using unix domain sockets
in trunk e.g.

    ProxyPassMatch ^/info.php$
"unix:/var/run/php5-fpm.sock|fcgi://localhost/home/covener/SRC/httpd-trunk/built/htdocs/"

The old test accepted the worker URL being a prefix of the worker:

    strncmp(url_copy, worker->s->name, worker_name_length) == 0)

but now that doesn't happen for ProxyPassMatch.  This seems to be
due to the last return expecting str[x] to have been totally consumed
by the expected (worker) string.


-- 
Eric Covener
covener@gmail.com

Re: svn commit: r1609680 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.c mod_proxy.h proxy_util.c

Posted by Eric Covener <co...@gmail.com>.
On Fri, Jul 11, 2014 at 6:36 AM,  <jk...@apache.org> wrote:
> static int ap_proxy_strcmp_ematch(const char *str, const char *expected)
> +{
> +    apr_size_t x, y;
> +
> +    for (x = 0, y = 0; expected[y]; ++y, ++x) {
> +        if ((!str[x]) && (expected[y] != '
> || !apr_isdigit(expected[y + 1])))
> +            return -1;
> +        if (expected[y] == ' && apr_isdigit(expected[y + 1])) {
> +            while (expected[y] == ' && apr_isdigit(expected[y + 1]))
> +                y += 2;
> +            if (!expected[y])
> +                return 0;
> +            while (str[x]) {
> +                int ret;
> +                if ((ret = ap_proxy_strcmp_ematch(&str[x++], &expected[y])) != 1)
> +                    return ret;
> +            }
> +            return -1;
> +        }
> +        else if (expected[y] == '\\') {
> +            /* NUL is an invalid char! */
> +            if (!expected[++y])
> +                return -2;
> +        }
> +        if (str[x] != expected[y])
> +            return 1;
> +    }
> +    return (str[x] != '\0');
> +}


This is breaking the common PHP-FPM recipes using unix domain sockets
in trunk e.g.

ProxyPassMatch ^/info.php$
"unix:/var/run/php5-fpm.sock|fcgi://localhost/home/covener/SRC/httpd-trunk/built/htdocs/"

The old test accepted the worker URL being a prefix of the worker:
 (, but now that doesn't happen for ProxyPassMatch.  This seems to be
due to the last return.






-- 
Eric Covener
covener@gmail.com