You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2013/10/11 18:12:42 UTC
svn commit: r1531340 - in /httpd/httpd/trunk: docs/manual/mod/mod_proxy.xml
modules/proxy/mod_proxy.c modules/proxy/mod_proxy.h
modules/proxy/mod_proxy_balancer.c modules/proxy/proxy_util.c
Author: jim
Date: Fri Oct 11 16:12:41 2013
New Revision: 1531340
URL: http://svn.apache.org/r1531340
Log:
Reformat the UDS support inline with a new naming structure.
Use a flag for speed for testing.
Modified:
httpd/httpd/trunk/docs/manual/mod/mod_proxy.xml
httpd/httpd/trunk/modules/proxy/mod_proxy.c
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/docs/manual/mod/mod_proxy.xml
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_proxy.xml?rev=1531340&r1=1531339&r2=1531340&view=diff
==============================================================================
--- httpd/httpd/trunk/docs/manual/mod/mod_proxy.xml (original)
+++ httpd/httpd/trunk/docs/manual/mod/mod_proxy.xml Fri Oct 11 16:12:41 2013
@@ -823,9 +823,9 @@ expressions</description>
<directive>ProxyPass</directive>.</note>
<p>Support for using a Unix Domain Socket is available by using a target
- of <code>uds=percent-encoded-path</code>. For example, to target the
+ of <code>|sock:/path/lis.sock</code>. For example, to target the
UDS at /home/www/socket you would use
- <code>http://uds=%2Fhome%2Fwww%2Fsocket</code></p>
+ <code>http://localhost/|sock:/home/www.socket</code></p>
<p>Suppose the local server has address <code>http://example.com/</code>;
then</p>
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1531340&r1=1531339&r2=1531340&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Fri Oct 11 16:12:41 2013
@@ -2017,8 +2017,8 @@ static const char *add_member(cmd_parms
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'",
- worker->s->name, balancer->s->name);
+ "Defined worker '%s%s' for balancer '%s'",
+ worker->s->name, (worker->s->uds ? "|" : ""), balancer->s->name);
PROXY_COPY_CONF_PARAMS(worker, conf);
} else {
reuse = 1;
Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1531340&r1=1531339&r2=1531340&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Fri Oct 11 16:12:41 2013
@@ -388,6 +388,7 @@ 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=1531340&r1=1531339&r2=1531340&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c Fri Oct 11 16:12:41 2013
@@ -1531,7 +1531,7 @@ static int balancer_handler(request_rec
ap_escape_uri(r->pool, worker->s->name),
"&nonce=", balancer->s->nonce,
"\">", NULL);
- ap_rvputs(r, worker->s->name, "</a></td>", NULL);
+ ap_rvputs(r, worker->s->name, (worker->s->uds ? "|" : ""), "</a></td>", NULL);
ap_rvputs(r, "<td>", ap_escape_html(r->pool, worker->s->route),
NULL);
ap_rvputs(r, "</td><td>",
Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1531340&r1=1531339&r2=1531340&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Fri Oct 11 16:12:41 2013
@@ -40,7 +40,6 @@
APLOG_USE_MODULE(proxy);
-#define UDS_SOCKET_STRING "uds="
/*
* Opaque structure containing target server info when
* using a forward proxy.
@@ -1566,6 +1565,7 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_g
return max_worker;
}
+
/*
* To create a worker from scratch first we define the
* specifics of the worker; this is all local data.
@@ -1581,10 +1581,25 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
int do_malloc)
{
int rv;
- apr_uri_t uri;
+ apr_uri_t uri, urisock;
proxy_worker_shared *wshared;
- char *ptr;
+ char *ptr, *sockpath = NULL;
+ /* Look to see if we are using UDS:
+ require format: http://localhost/whatever|sock:/path
+ This results in talking http to the socket at /whatever/path
+ */
+ ptr = ap_strchr((char *)url, '|');
+ if (ptr) {
+ *ptr = '\0';
+ rv = apr_uri_parse(p, ptr+1, &urisock);
+ if (rv == APR_SUCCESS && !strcasecmp(urisock.scheme, "sock")) {
+ sockpath = urisock.path;
+ }
+ else {
+ *ptr = '|';
+ }
+ }
rv = apr_uri_parse(p, url, &uri);
if (rv != APR_SUCCESS) {
@@ -1596,6 +1611,11 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
ap_str_tolower(uri.hostname);
ap_str_tolower(uri.scheme);
+ if (sockpath) {
+ uri.hostname = "localhost";
+ uri.path = apr_pstrcat(p, uri.path, (*sockpath == '/' ? "" : "/"),
+ sockpath, NULL);
+ }
/*
* Workers can be associated w/ balancers or on their
* own; ie: the generic reverse-proxy or a worker
@@ -1650,6 +1670,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->uds = (sockpath != NULL);
(*worker)->hash = wshared->hash;
(*worker)->context = NULL;
@@ -2030,7 +2051,30 @@ PROXY_DECLARE(int) ap_proxy_acquire_conn
(*conn)->worker = worker;
(*conn)->close = 0;
(*conn)->inreslist = 0;
- (*conn)->uds_path = NULL;
+
+ if (worker->s->uds) {
+ 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);
+ }
+ }
+ if ((*conn)->uds_path) {
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO()
+ "%s: has determined UDS as %s",
+ proxy_function, (*conn)->uds_path);
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO()
+ "%s: cannot parse for UDS (%s)",
+ proxy_function, worker->s->name);
+
+ }
+ }
+ else {
+ (*conn)->uds_path = NULL;
+ }
+
return OK;
}
@@ -2047,30 +2091,6 @@ PROXY_DECLARE(int) ap_proxy_release_conn
return OK;
}
-/*
- * Decodes a '%' escaped string, and returns the number of characters
- */
-static int decodeenc(char *x)
-{
- int i, j, ch;
-
- if (x[0] == '\0') {
- /* special case for no characters */
- return 0;
- }
- for (i = 0, j = 0; x[i] != '\0'; i++, j++) {
- /* decode it if not already done */
- ch = x[i];
- if (ch == '%' && apr_isxdigit(x[i + 1]) && apr_isxdigit(x[i + 2])) {
- ch = ap_proxy_hex2c(&x[i + 1]);
- i += 2;
- }
- x[j] = ch;
- }
- x[j] = '\0';
- return j;
-}
-
PROXY_DECLARE(int)
ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
proxy_server_conf *conf,
@@ -2127,7 +2147,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 || strncmp(conn->hostname, UDS_SOCKET_STRING, sizeof(UDS_SOCKET_STRING)-1) == 0) {
+ worker->s->disablereuse || worker->s->uds) {
if (proxyname) {
conn->hostname = apr_pstrdup(conn->pool, proxyname);
conn->port = proxyport;
@@ -2165,12 +2185,7 @@ ap_proxy_determine_connection(apr_pool_t
conn->port = uri->port;
}
socket_cleanup(conn);
- if (strncmp(conn->hostname, UDS_SOCKET_STRING, sizeof(UDS_SOCKET_STRING)-1) == 0) {
- char *uds_path = apr_pstrdup(conn->pool, conn->hostname + sizeof(UDS_SOCKET_STRING) - 1);
- decodeenc(uds_path);
- conn->uds_path = uds_path;
- }
- else if (!worker->s->is_address_reusable || worker->s->disablereuse) {
+ if (!worker->s->uds && 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.
@@ -2181,7 +2196,7 @@ ap_proxy_determine_connection(apr_pool_t
conn->pool);
}
}
- if (worker->s->is_address_reusable && !worker->s->disablereuse) {
+ if (!worker->s->uds && 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.