aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_inet.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ngx_inet.c')
-rw-r--r--src/core/ngx_inet.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index 12bf9f81a..b5c57b7a4 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -526,6 +526,85 @@ ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)
ngx_int_t
+ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,
+ size_t len)
+{
+ u_char *p, *last;
+ size_t plen;
+ ngx_int_t rc, port;
+ struct sockaddr_in *sin;
+#if (NGX_HAVE_INET6)
+ struct sockaddr_in6 *sin6;
+#endif
+
+ rc = ngx_parse_addr(pool, addr, text, len);
+
+ if (rc != NGX_DECLINED) {
+ return rc;
+ }
+
+ last = text + len;
+
+#if (NGX_HAVE_INET6)
+ if (len && text[0] == '[') {
+
+ p = ngx_strlchr(text, last, ']');
+
+ if (p == NULL || p == last - 1 || *++p != ':') {
+ return NGX_DECLINED;
+ }
+
+ text++;
+ len -= 2;
+
+ } else
+#endif
+
+ {
+ p = ngx_strlchr(text, last, ':');
+
+ if (p == NULL) {
+ return NGX_DECLINED;
+ }
+ }
+
+ p++;
+ plen = last - p;
+
+ port = ngx_atoi(p, plen);
+
+ if (port < 1 || port > 65535) {
+ return NGX_DECLINED;
+ }
+
+ len -= plen + 1;
+
+ rc = ngx_parse_addr(pool, addr, text, len);
+
+ if (rc != NGX_OK) {
+ return rc;
+ }
+
+ switch (addr->sockaddr->sa_family) {
+
+#if (NGX_HAVE_INET6)
+ case AF_INET6:
+ sin6 = (struct sockaddr_in6 *) addr->sockaddr;
+ sin6->sin6_port = htons(port);
+ break;
+#endif
+
+ default: /* AF_INET */
+ sin = (struct sockaddr_in *) addr->sockaddr;
+ sin->sin_port = htons(port);
+ break;
+ }
+
+ return NGX_OK;
+}
+
+
+ngx_int_t
ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)
{
u_char *p;