upstream choice modules
diff --git a/src/core/ngx_core.h b/src/core/ngx_core.h
index ec8bbf3..f4163e9 100644
--- a/src/core/ngx_core.h
+++ b/src/core/ngx_core.h
@@ -19,7 +19,6 @@
typedef struct ngx_command_s ngx_command_t;
typedef struct ngx_file_s ngx_file_t;
typedef struct ngx_event_s ngx_event_t;
-typedef struct ngx_peers_s ngx_peers_t;
typedef struct ngx_connection_s ngx_connection_t;
typedef void (*ngx_event_handler_pt)(ngx_event_t *ev);
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index 6b2c272..6871602 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -6,8 +6,6 @@
#include <ngx_config.h>
#include <ngx_core.h>
-#include <ngx_event.h>
-#include <ngx_event_connect.h>
/*
@@ -239,8 +237,6 @@
#if (NGX_HAVE_UNIX_DOMAIN)
- u->type = NGX_PARSE_URL_UNIX;
-
p += 5;
len -= 5;
@@ -271,8 +267,8 @@
return NGX_ERROR;
}
- u->peers = ngx_pcalloc(cf->pool, sizeof(ngx_peers_t));
- if (u->peers == NULL) {
+ u->addrs = ngx_pcalloc(cf->pool, sizeof(ngx_peer_addr_t));
+ if (u->addrs == NULL) {
return NGX_ERROR;
}
@@ -281,16 +277,15 @@
return NGX_ERROR;
}
- u->peers->number = 1;
+ u->naddrs = 1;
saun->sun_family = AF_UNIX;
(void) ngx_cpystrn((u_char *) saun->sun_path, p, len + 1);
- u->peers->peer[0].sockaddr = (struct sockaddr *) saun;
- u->peers->peer[0].socklen = sizeof(struct sockaddr_un);
- u->peers->peer[0].name.len = len + 5;
- u->peers->peer[0].name.data = u->url.data;
- u->peers->peer[0].uri_separator = ":";
+ u->addrs[0].sockaddr = (struct sockaddr *) saun;
+ u->addrs[0].socklen = sizeof(struct sockaddr_un);
+ u->addrs[0].name.len = len + 5;
+ u->addrs[0].name.data = u->url.data;
u->host_header.len = sizeof("localhost") - 1;
u->host_header.data = (u_char *) "localhost";
@@ -310,8 +305,6 @@
return NGX_ERROR;
}
- u->type = NGX_PARSE_URL_INET;
-
u->host.data = p;
u->host_header.len = len;
u->host_header.data = p;
@@ -323,7 +316,7 @@
u->host.len = i;
if (!u->uri_part) {
- u->port.len = &p[len] - u->port.data;
+ u->port.len = len - (i + 1);
break;
}
}
@@ -338,8 +331,8 @@
}
if (u->port.data == NULL) {
- u->default_port = 1;
- goto port;
+ u->no_port = 1;
+ goto no_port;
}
u->port.len = &p[i] - u->port.data;
@@ -375,10 +368,10 @@
port = ngx_atoi(p, len);
if (port == NGX_ERROR) {
- u->default_port = 1;
u->host.len = len;
+ u->no_port = 1;
- goto port;
+ goto no_port;
}
u->port.len = len;
@@ -388,9 +381,10 @@
u->portn = (in_port_t) port;
-port:
+no_port:
if (u->listen) {
+
if (u->portn == 0) {
if (u->default_portn == 0) {
u->err = "no port";
@@ -435,13 +429,9 @@
return NGX_OK;
}
- if (u->default_port) {
+ if (u->no_port) {
- if (u->upstream) {
- return NGX_OK;
- }
-
- if (u->default_portn == 0) {
+ if (u->default_portn == 0 && !u->upstream) {
u->err = "no port";
return NGX_ERROR;
}
@@ -455,12 +445,8 @@
u->port.len = ngx_sprintf(u->port.data, "%d", u->portn) - u->port.data;
- } else if (u->portn) {
- if (u->portn == u->default_portn) {
- u->default_port = 1;
- }
+ } else if (u->portn == 0) {
- } else {
u->err = "no port";
return NGX_ERROR;
}
@@ -470,14 +456,11 @@
return NGX_ERROR;
}
- u->peers = ngx_inet_resolve_peer(cf, &u->host, u->portn);
-
- if (u->peers == NULL) {
- return NGX_ERROR;
+ if (u->no_resolve) {
+ return NGX_OK;
}
- if (u->peers == NGX_CONF_ERROR) {
- u->err = "host not found";
+ if (ngx_inet_resolve_host(cf, u) != NGX_OK) {
return NGX_ERROR;
}
@@ -485,23 +468,22 @@
}
-ngx_peers_t *
-ngx_inet_resolve_peer(ngx_conf_t *cf, ngx_str_t *name, in_port_t port)
+ngx_int_t
+ngx_inet_resolve_host(ngx_conf_t *cf, ngx_url_t *u)
{
u_char *host;
size_t len;
in_addr_t in_addr;
ngx_uint_t i;
- ngx_peers_t *peers;
struct hostent *h;
struct sockaddr_in *sin;
- host = ngx_palloc(cf->temp_pool, name->len + 1);
+ host = ngx_palloc(cf->temp_pool, u->host.len + 1);
if (host == NULL) {
- return NULL;
+ return NGX_ERROR;
}
- (void) ngx_cpystrn(host, name->data, name->len + 1);
+ (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);
/* AF_INET only */
@@ -511,92 +493,88 @@
h = gethostbyname((char *) host);
if (h == NULL || h->h_addr_list[0] == NULL) {
- return NGX_CONF_ERROR;
+ u->err = "host not found";
+ return NGX_ERROR;
}
- for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }
+ if (u->one_addr == 0) {
+ for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }
+
+ } else {
+ i = 1;
+ }
/* MP: ngx_shared_palloc() */
- peers = ngx_pcalloc(cf->pool,
- sizeof(ngx_peers_t) + sizeof(ngx_peer_t) * (i - 1));
- if (peers == NULL) {
- return NULL;
+ u->addrs = ngx_pcalloc(cf->pool, i * sizeof(ngx_peer_addr_t));
+ if (u->addrs == NULL) {
+ return NGX_ERROR;
}
- peers->number = i;
+ u->naddrs = i;
for (i = 0; h->h_addr_list[i] != NULL; i++) {
sin = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in));
if (sin == NULL) {
- return NULL;
+ return NGX_ERROR;
}
sin->sin_family = AF_INET;
- sin->sin_port = htons(port);
+ sin->sin_port = htons(u->portn);
sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);
- peers->peer[i].sockaddr = (struct sockaddr *) sin;
- peers->peer[i].socklen = sizeof(struct sockaddr_in);
+ u->addrs[i].sockaddr = (struct sockaddr *) sin;
+ u->addrs[i].socklen = sizeof(struct sockaddr_in);
len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1;
- peers->peer[i].name.data = ngx_palloc(cf->pool, len);
- if (peers->peer[i].name.data == NULL) {
- return NULL;
+ u->addrs[i].name.data = ngx_palloc(cf->pool, len);
+ if (u->addrs[i].name.data == NULL) {
+ return NGX_ERROR;
}
len = ngx_sock_ntop(AF_INET, (struct sockaddr *) sin,
- peers->peer[i].name.data, len);
+ u->addrs[i].name.data, len);
- peers->peer[i].name.len =
- ngx_sprintf(&peers->peer[i].name.data[len],
- ":%d", port)
- - peers->peer[i].name.data;
-
- peers->peer[i].uri_separator = "";
-
- peers->peer[i].weight = NGX_CONF_UNSET_UINT;
- peers->peer[i].max_fails = NGX_CONF_UNSET_UINT;
- peers->peer[i].fail_timeout = NGX_CONF_UNSET;
+ u->addrs[i].name.len = ngx_sprintf(&u->addrs[i].name.data[len],
+ ":%d", u->portn)
+ - u->addrs[i].name.data;
}
} else {
/* MP: ngx_shared_palloc() */
- peers = ngx_pcalloc(cf->pool, sizeof(ngx_peers_t));
- if (peers == NULL) {
- return NULL;
+ u->addrs = ngx_pcalloc(cf->pool, sizeof(ngx_peer_addr_t));
+ if (u->addrs == NULL) {
+ return NGX_ERROR;
}
sin = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in));
if (sin == NULL) {
- return NULL;
+ return NGX_ERROR;
}
- peers->number = 1;
+ u->naddrs = 1;
sin->sin_family = AF_INET;
- sin->sin_port = htons(port);
+ sin->sin_port = htons(u->portn);
sin->sin_addr.s_addr = in_addr;
- peers->peer[0].sockaddr = (struct sockaddr *) sin;
- peers->peer[0].socklen = sizeof(struct sockaddr_in);
+ u->addrs[0].sockaddr = (struct sockaddr *) sin;
+ u->addrs[0].socklen = sizeof(struct sockaddr_in);
- peers->peer[0].name.data = ngx_palloc(cf->pool,
- name->len + sizeof(":65536") - 1);
- if (peers->peer[0].name.data == NULL) {
- return NULL;
+ u->addrs[0].name.data = ngx_palloc(cf->pool,
+ u->host.len + sizeof(":65536") - 1);
+ if (u->addrs[0].name.data == NULL) {
+ return NGX_ERROR;
}
- peers->peer[0].name.len = ngx_sprintf(peers->peer[0].name.data, "%V:%d",
- name, port)
- - peers->peer[0].name.data;
-
- peers->peer[0].uri_separator = "";
+ u->addrs[0].name.len = ngx_sprintf(u->addrs[0].name.data, "%V:%d",
+ &u->host, u->portn)
+ - u->addrs[0].name.data;
}
- return peers;
+ return NGX_OK;
}
diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h
index 1cec748..94f195f 100644
--- a/src/core/ngx_inet.h
+++ b/src/core/ngx_inet.h
@@ -12,80 +12,51 @@
#include <ngx_core.h>
-#define NGX_PARSE_URL_INET 1
-#define NGX_PARSE_URL_UNIX 2
-
-
typedef struct {
- in_addr_t addr;
- in_addr_t mask;
+ in_addr_t addr;
+ in_addr_t mask;
} ngx_inet_cidr_t;
-typedef struct {
- struct sockaddr *sockaddr;
- socklen_t socklen;
-
- ngx_str_t name;
- char *uri_separator;
-
- ngx_uint_t current_weight;
- ngx_uint_t weight;
-
- ngx_uint_t fails;
- time_t accessed;
-
- ngx_uint_t max_fails;
- time_t fail_timeout;
-
-#if (NGX_SSL)
- ngx_ssl_session_t *ssl_session;
-#endif
-} ngx_peer_t;
-
-
-struct ngx_peers_s {
- ngx_uint_t current;
-
- ngx_uint_t number;
- ngx_uint_t last_cached;
-
- /* ngx_mutex_t *mutex; */
- ngx_connection_t **cached;
-
- ngx_peer_t peer[1];
-};
-
-
typedef union {
- in_addr_t in_addr;
+ in_addr_t in_addr;
} ngx_url_addr_t;
typedef struct {
- ngx_int_t type;
+ struct sockaddr *sockaddr;
+ socklen_t socklen;
+ ngx_str_t name;
+} ngx_peer_addr_t;
- ngx_peers_t *peers;
- ngx_str_t url;
- ngx_str_t host;
- ngx_str_t host_header;
- ngx_str_t port;
- ngx_str_t uri;
+typedef struct {
+ ngx_int_t type;
- in_port_t portn;
- in_port_t default_portn;
+ ngx_str_t url;
+ ngx_str_t host;
+ ngx_str_t host_header;
+ ngx_str_t port;
+ ngx_str_t uri;
- unsigned listen:1;
- unsigned uri_part:1;
- unsigned upstream:1;
+ in_port_t portn;
+ in_port_t default_portn;
- unsigned default_port:1;
- unsigned wildcard:1;
+ unsigned listen:1;
+ unsigned uri_part:1;
+ unsigned upstream:1;
+ unsigned no_resolve:1;
+ unsigned one_addr:1;
- ngx_url_addr_t addr;
+ unsigned wildcard:1;
+ unsigned no_port:1;
- char *err;
+ ngx_url_addr_t addr;
+
+ ngx_peer_addr_t *addrs;
+ ngx_uint_t naddrs;
+
+ char *err;
} ngx_url_t;
@@ -93,8 +64,8 @@
size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len);
ngx_int_t ngx_ptocidr(ngx_str_t *text, void *cidr);
ngx_int_t ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u);
-ngx_peers_t *ngx_inet_resolve_peer(ngx_conf_t *cf, ngx_str_t *name,
- in_port_t port);
+ngx_int_t ngx_inet_resolve_host(ngx_conf_t *cf, ngx_url_t *u);
+
#endif /* _NGX_INET_H_INCLUDED_ */