diff options
author | Igor Sysoev <igor@sysoev.ru> | 2006-12-04 16:46:13 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2006-12-04 16:46:13 +0000 |
commit | 3d2fd18a3935a7f1b68f14aa95990eef8841acad (patch) | |
tree | 9b0bc5932393105bf4f89f403d042494762b8ea2 /src/core | |
parent | a53f7293c8b8e2dcc3168ce96903afe5c55dd763 (diff) | |
download | nginx-3d2fd18a3935a7f1b68f14aa95990eef8841acad.tar.gz nginx-3d2fd18a3935a7f1b68f14aa95990eef8841acad.zip |
upstream choice modules
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/ngx_core.h | 1 | ||||
-rw-r--r-- | src/core/ngx_inet.c | 150 | ||||
-rw-r--r-- | src/core/ngx_inet.h | 91 |
3 files changed, 95 insertions, 147 deletions
diff --git a/src/core/ngx_core.h b/src/core/ngx_core.h index ec8bbf3ae..f4163e915 100644 --- a/src/core/ngx_core.h +++ b/src/core/ngx_core.h @@ -19,7 +19,6 @@ typedef struct ngx_open_file_s ngx_open_file_t; 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 6b2c2721f..687160269 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) #if (NGX_HAVE_UNIX_DOMAIN) - u->type = NGX_PARSE_URL_UNIX; - p += 5; len -= 5; @@ -271,8 +267,8 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) } 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ port: 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 @@ port: 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 @@ port: 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 @@ port: } -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 @@ ngx_inet_resolve_peer(ngx_conf_t *cf, ngx_str_t *name, in_port_t port) 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); - - peers->peer[i].name.len = - ngx_sprintf(&peers->peer[i].name.data[len], - ":%d", port) - - peers->peer[i].name.data; + u->addrs[i].name.data, len); - 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 1cec748c0..94f195f99 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; + + ngx_str_t url; + ngx_str_t host; + ngx_str_t host_header; + ngx_str_t port; + ngx_str_t uri; - in_port_t portn; - in_port_t default_portn; + in_port_t portn; + in_port_t default_portn; - unsigned listen:1; - unsigned uri_part:1; - unsigned upstream:1; + unsigned listen:1; + unsigned uri_part:1; + unsigned upstream:1; + unsigned no_resolve:1; + unsigned one_addr:1; - unsigned default_port:1; - unsigned wildcard:1; + unsigned wildcard:1; + unsigned no_port:1; - ngx_url_addr_t addr; + ngx_url_addr_t addr; - char *err; + ngx_peer_addr_t *addrs; + ngx_uint_t naddrs; + + char *err; } ngx_url_t; @@ -93,8 +64,8 @@ size_t ngx_sock_ntop(int family, struct sockaddr *sa, u_char *text, size_t len); 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_ */ |