diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2012-06-04 14:07:34 +0000 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2012-06-04 14:07:34 +0000 |
commit | 596226f6f7ca41f612ca0d34f7d38dd07a1f1ed7 (patch) | |
tree | 6cea86fcb6a914ebd14b475e40c9ff9ce06fe921 /src/core/ngx_inet.c | |
parent | 4888969baa02f4e0587afea2a9d42e596d042499 (diff) | |
download | nginx-596226f6f7ca41f612ca0d34f7d38dd07a1f1ed7.tar.gz nginx-596226f6f7ca41f612ca0d34f7d38dd07a1f1ed7.zip |
Support for IPv6 literals in proxy_pass and so on.
Diffstat (limited to 'src/core/ngx_inet.c')
-rw-r--r-- | src/core/ngx_inet.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 4acaf4acb..3db0136e5 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -808,6 +808,8 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u) u->uri.len = last - uri; u->uri.data = uri; + + last = uri; } if (*port == ':') { @@ -840,8 +842,8 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u) return NGX_ERROR; } - u->host.len = len; - u->host.data = host; + u->host.len = len + 2; + u->host.data = host - 1; if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) { u->err = "invalid IPv6 address"; @@ -852,17 +854,38 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u) u->wildcard = 1; } + if (u->no_port) { + u->port = u->default_port; + sin6->sin6_port = htons(u->default_port); + } + u->family = AF_INET6; + u->naddrs = 1; - if (u->no_resolve) { - return NGX_OK; + u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t)); + if (u->addrs == NULL) { + return NGX_ERROR; } - if (u->no_port) { - u->port = u->default_port; - sin6->sin6_port = htons(u->default_port); + sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6)); + if (sin6 == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6)); + + u->addrs[0].sockaddr = (struct sockaddr *) sin6; + u->addrs[0].socklen = sizeof(struct sockaddr_in6); + + p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1); + if (p == NULL) { + return NGX_ERROR; } + u->addrs[0].name.len = ngx_sprintf(p, "%V:%d", + &u->host, u->port) - p; + u->addrs[0].name.data = p; + return NGX_OK; #else |