now the "listen" directives use ngx_parse_url()
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index cf4b8f6..32fc2c5 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -10,6 +10,9 @@
#include <ngx_event_connect.h>
+static char *ngx_inet_parse_host_port(ngx_inet_upstream_t *u);
+
+
/*
* ngx_sock_ntop() and ngx_inet_ntop() may be implemented as
* "ngx_sprintf(text, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3])", however,
@@ -223,10 +226,11 @@
ngx_int_t
ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u)
{
- u_char *p;
+ u_char *p, *host;
size_t len;
ngx_int_t port;
ngx_uint_t i;
+ struct hostent *h;
#if (NGX_HAVE_UNIX_DOMAIN)
struct sockaddr_un *saun;
#endif
@@ -390,6 +394,47 @@
port:
if (u->listen) {
+ if (u->portn == 0) {
+ if (u->default_portn == 0) {
+ u->err = "no port";
+ return NGX_ERROR;
+ }
+
+ u->portn = u->default_portn;
+ }
+
+ if (u->host.len == 1 && u->host.data[0] == '*') {
+ u->host.len = 0;
+ }
+
+ /* AF_INET only */
+
+ if (u->host.len) {
+
+ host = ngx_palloc(cf->temp_pool, u->host.len + 1);
+ if (host == NULL) {
+ return NGX_ERROR;
+ }
+
+ (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);
+
+ u->addr.in_addr = inet_addr((const char *) host);
+
+ if (u->addr.in_addr == INADDR_NONE) {
+ h = gethostbyname((const char *) host);
+
+ if (h == NULL || h->h_addr_list[0] == NULL) {
+ u->err = "host not found";
+ return NGX_ERROR;
+ }
+
+ u->addr.in_addr = *(in_addr_t *)(h->h_addr_list[0]);
+ }
+
+ } else {
+ u->addr.in_addr = INADDR_ANY;
+ }
+
return NGX_OK;
}
@@ -737,7 +782,7 @@
}
-char *
+static char *
ngx_inet_parse_host_port(ngx_inet_upstream_t *u)
{
size_t i;
diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h
index 3014023..380ea50 100644
--- a/src/core/ngx_inet.h
+++ b/src/core/ngx_inet.h
@@ -17,8 +17,8 @@
typedef struct {
- in_addr_t addr;
- in_addr_t mask;
+ in_addr_t addr;
+ in_addr_t mask;
} ngx_inet_cidr_t;
@@ -57,53 +57,60 @@
};
+typedef union {
+ in_addr_t in_addr;
+} ngx_url_addr_t;
+
+
typedef struct {
- ngx_int_t type;
+ ngx_int_t type;
- ngx_peers_t *peers;
+ 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;
+ 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 default_port:1;
- unsigned wildcard:1;
+ unsigned default_port:1;
+ unsigned wildcard:1;
- char *err;
+ ngx_url_addr_t addr;
+
+ char *err;
} ngx_url_t;
typedef struct {
- ngx_str_t name; /* "schema:host:port/uri" */
- ngx_str_t url; /* "host:port/uri" */
- ngx_str_t host;
- ngx_str_t uri;
- ngx_str_t host_header; /* "host:port" */
- ngx_str_t port_text; /* "port" */
+ ngx_str_t name; /* "schema:host:port/uri" */
+ ngx_str_t url; /* "host:port/uri" */
+ ngx_str_t host;
+ ngx_str_t uri;
+ ngx_str_t host_header; /* "host:port" */
+ ngx_str_t port_text; /* "port" */
- in_port_t port;
+ in_port_t port;
- in_port_t default_port_value;
+ in_port_t default_port_value;
- unsigned default_port:1;
- unsigned wildcard:1;
+ unsigned default_port:1;
+ unsigned wildcard:1;
- unsigned uri_part:1;
- unsigned port_only:1;
+ unsigned uri_part:1;
+ unsigned port_only:1;
} ngx_inet_upstream_t;
size_t ngx_sock_ntop(int family, struct sockaddr *sa, u_char *text,
- size_t len);
+ 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);
@@ -111,7 +118,6 @@
ngx_peers_t *ngx_inet_upstream_parse(ngx_conf_t *cf, ngx_inet_upstream_t *u);
ngx_peers_t *ngx_inet_resolve_peer(ngx_conf_t *cf, ngx_str_t *name,
in_port_t port);
-char *ngx_inet_parse_host_port(ngx_inet_upstream_t *u);
ngx_int_t ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u);