diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ngx_inet.c | 49 | ||||
| -rw-r--r-- | src/core/ngx_inet.h | 68 |
2 files changed, 84 insertions, 33 deletions
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index cf4b8f699..32fc2c555 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_ptocidr(ngx_str_t *text, void *cidr) 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 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) 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 @@ ngx_inet_upstream_parse(ngx_conf_t *cf, ngx_inet_upstream_t *u) } -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 301402382..380ea502f 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 @@ struct ngx_peers_s { }; +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; + ngx_url_addr_t addr; - char *err; + 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_int_t ngx_ptocidr(ngx_str_t *text, void *cidr); 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); |
