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