httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Fritsch ...@sfritsch.de>
Subject Re: 2.3.15 RewriteRule P
Date Mon, 02 Jan 2012 21:48:08 GMT
On Sun, 1 Jan 2012, Eric Covener wrote:

>> Can anyone more familiar with the code verify this? Steffen, maybe you
>> can try the change and see if it helps?
>
> I think there are a few additional wrinkles -- I couldn't repro after
> this but no confident about what's right with the addr handling:
>
> http://people.apache.org/~covener/patches/trunk-proxy_toggle_ports.diff


> Index: modules/proxy/proxy_util.c
> ===================================================================
> --- modules/proxy/proxy_util.c	(revision 1226300)
> +++ modules/proxy/proxy_util.c	(working copy)
> @@ -2029,7 +2029,7 @@
>       * TODO: Handle this much better...
>       */
>      if (!conn->hostname || !worker->s->is_address_reusable ||
> -         worker->s->disablereuse ||
> +         worker->s->disablereuse || conn->port != uri->port ||
>           (r->connection->keepalives &&
>           (r->proxyreq == PROXYREQ_PROXY || r->proxyreq == PROXYREQ_REVERSE) &&
>           (strcasecmp(conn->hostname, uri->hostname) != 0) ) ) {

The different handling of conn->port and conn->hostname doesn't look
right to me. Can the r->proxyreq check actually be false at this point or is
it simply redundant? And shouldn't the strcasecmp(conn->hostname,
uri->hostname) check be done regardless of r->connection->keepalives?

> @@ -2076,6 +2076,8 @@
>                                      conn->pool);
>      }
>      else if (!worker->cp->addr) {
> +        conn->port = uri->port;
> +        conn->hostname = apr_pstrdup(conn->pool, uri->hostname);
>          if ((err = PROXY_THREAD_LOCK(worker)) != APR_SUCCESS) {
>              ap_log_rerror(APLOG_MARK, APLOG_ERR, err, r, APLOGNO(00945) "lock");
>              return HTTP_INTERNAL_SERVER_ERROR;
> @@ -2097,7 +2099,9 @@
>          }
>      }
>      else {
> -        conn->addr = worker->cp->addr;
> +        if (!conn->addr) { 
> +            conn->addr = worker->cp->addr;
> +        }
>      }
>      /* Close a possible existing socket if we are told to do so */
>      if (conn->close) {



> <virtualhost *:80>
>  RewriteEngine on
>  RewriteRule ^/a http://localhost:81/a [P]
>  RewriteRule ^/b http://localhost:82/b [P]
> </virtualhost>
> <virtualhost *:81>
>  AliasMatch ^/a$ /home/covener/SRC/httpd-trunk/built/icons/a.gif
> </virtualhost>
> <virtualhost *:82>
>  AliasMatch ^/b$ /home/covener/SRC/httpd-trunk/built/icons/a.gif
> </virtualhost>
>
> Before any patch, as simple as a/b fails. The worker->cp->addr copy
> issue fails with something like a/b/b.


Mime
View raw message