diff src/core/ngx_inet.c @ 266:251bcd11a5b8 NGINX_0_5_3

nginx 0.5.3 *) Feature: the ngx_http_perl_module supports the $r->status, $r->log_error, and $r->sleep methods. *) Feature: the $r->variable method supports variables that do not exist in nginx configuration. *) Bugfix: the $r->has_request_body method did not work.
author Igor Sysoev <http://sysoev.ru>
date Wed, 13 Dec 2006 00:00:00 +0300
parents e0b1d0a6c629
children 5bef04fc3fd5
line wrap: on
line diff
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -221,8 +221,8 @@ 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, *host;
-    size_t               len;
+    u_char              *p, *host, *port_start;
+    size_t               len, port_len;
     ngx_int_t            port;
     ngx_uint_t           i;
     struct hostent      *h;
@@ -290,8 +290,7 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t 
         u->host.len = len;
         u->host.data = p;
 
-        u->host_header.len = sizeof("localhost") - 1;
-        u->host_header.data = (u_char *) "localhost";
+        u->unix_socket = 1;
 
         return NGX_OK;
 
@@ -309,17 +308,18 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t 
     }
 
     u->host.data = p;
-    u->host_header.len = len;
-    u->host_header.data = p;
+
+    port_start = NULL;
+    port_len = 0;
 
     for (i = 0; i < len; i++) {
 
         if (p[i] == ':') {
-            u->port.data = &p[i + 1];
+            port_start = &p[i + 1];
             u->host.len = i;
 
             if (!u->uri_part) {
-                u->port.len = len - (i + 1);
+                port_len = len - (i + 1);
                 break;
             }
         }
@@ -327,20 +327,19 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t 
         if (p[i] == '/') {
             u->uri.len = len - i;
             u->uri.data = &p[i];
-            u->host_header.len = i;
 
             if (u->host.len == 0) {
                 u->host.len = i;
             }
 
-            if (u->port.data == NULL) {
+            if (port_start == NULL) {
                 u->no_port = 1;
                 goto no_port;
             }
 
-            u->port.len = &p[i] - u->port.data;
+            port_len = &p[i] - port_start;
 
-            if (u->port.len == 0) {
+            if (port_len == 0) {
                 u->err = "invalid port";
                 return NGX_ERROR;
             }
@@ -349,18 +348,18 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t 
         }
     }
 
-    if (u->port.data) {
+    if (port_start) {
 
-        if (u->port.len == 0) {
-            u->port.len = &p[i] - u->port.data;
+        if (port_len == 0) {
+            port_len = &p[i] - port_start;
 
-            if (u->port.len == 0) {
+            if (port_len == 0) {
                 u->err = "invalid port";
                 return NGX_ERROR;
             }
         }
 
-        port = ngx_atoi(u->port.data, u->port.len);
+        port = ngx_atoi(port_start, port_len);
 
         if (port == NGX_ERROR || port < 1 || port > 65536) {
             u->err = "invalid port";
@@ -377,24 +376,22 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t 
             goto no_port;
         }
 
-        u->port.len = len;
-        u->port.data = p;
         u->wildcard = 1;
     }
 
-    u->portn = (in_port_t) port;
+    u->port = (in_port_t) port;
 
 no_port:
 
     if (u->listen) {
 
-        if (u->portn == 0) {
-            if (u->default_portn == 0) {
+        if (u->port == 0) {
+            if (u->default_port == 0) {
                 u->err = "no port";
                 return NGX_ERROR;
             }
 
-            u->portn = u->default_portn;
+            u->port = u->default_port;
         }
 
         if (u->host.len == 1 && u->host.data[0] == '*') {
@@ -422,7 +419,7 @@ no_port:
                     return NGX_ERROR;
                 }
 
-                u->addr.in_addr = *(in_addr_t *)(h->h_addr_list[0]);
+                u->addr.in_addr = *(in_addr_t *) (h->h_addr_list[0]);
             }
 
         } else {
@@ -432,28 +429,6 @@ no_port:
         return NGX_OK;
     }
 
-    if (u->no_port) {
-
-        if (u->default_portn == 0 && !u->upstream) {
-            u->err = "no port";
-            return NGX_ERROR;
-        }
-
-        u->portn = u->default_portn;
-
-        u->port.data = ngx_palloc(cf->pool, sizeof("65536") - 1);
-        if (u->port.data == NULL) {
-            return NGX_ERROR;
-        }
-
-        u->port.len = ngx_sprintf(u->port.data, "%d", u->portn) - u->port.data;
-
-    } else if (u->portn == 0) {
-
-        u->err = "no port";
-        return NGX_ERROR;
-    }
-
     if (u->host.len == 0) {
         u->err = "no host";
         return NGX_ERROR;
@@ -463,6 +438,15 @@ no_port:
         return NGX_OK;
     }
 
+    if (u->no_port) {
+        u->port = u->default_port;
+    }
+
+    if (u->port == 0) {
+        u->err = "no port";
+        return NGX_ERROR;
+    }
+
     if (ngx_inet_resolve_host(cf, u) != NGX_OK) {
         return NGX_ERROR;
     }
@@ -474,7 +458,7 @@ no_port:
 ngx_int_t
 ngx_inet_resolve_host(ngx_conf_t *cf, ngx_url_t *u)
 {
-    u_char              *host;
+    u_char              *p, *host;
     size_t               len;
     in_addr_t            in_addr;
     ngx_uint_t           i;
@@ -524,7 +508,7 @@ ngx_inet_resolve_host(ngx_conf_t *cf, ng
             }
 
             sin->sin_family = AF_INET;
-            sin->sin_port = htons(u->portn);
+            sin->sin_port = htons(u->port);
             sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);
 
             u->addrs[i].sockaddr = (struct sockaddr *) sin;
@@ -532,17 +516,15 @@ ngx_inet_resolve_host(ngx_conf_t *cf, ng
 
             len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1;
 
-            u->addrs[i].name.data = ngx_palloc(cf->pool, len);
-            if (u->addrs[i].name.data == NULL) {
+            p = ngx_palloc(cf->pool, len);
+            if (p == NULL) {
                 return NGX_ERROR;
             }
 
-            len = ngx_sock_ntop(AF_INET, (struct sockaddr *) sin,
-                                u->addrs[i].name.data, len);
+            len = ngx_sock_ntop(AF_INET, (struct sockaddr *) sin, p, len);
 
-            u->addrs[i].name.len = ngx_sprintf(&u->addrs[i].name.data[len],
-                                               ":%d", u->portn)
-                                      - u->addrs[i].name.data;
+            u->addrs[i].name.len = ngx_sprintf(&p[len], ":%d", u->port) - p;
+            u->addrs[i].name.data = p;
         }
 
     } else {
@@ -562,21 +544,19 @@ ngx_inet_resolve_host(ngx_conf_t *cf, ng
         u->naddrs = 1;
 
         sin->sin_family = AF_INET;
-        sin->sin_port = htons(u->portn);
+        sin->sin_port = htons(u->port);
         sin->sin_addr.s_addr = in_addr;
 
         u->addrs[0].sockaddr = (struct sockaddr *) sin;
         u->addrs[0].socklen = sizeof(struct sockaddr_in);
 
-        u->addrs[0].name.data = ngx_palloc(cf->pool,
-                                           u->host.len + sizeof(":65536") - 1);
-        if (u->addrs[0].name.data == NULL) {
+        p = ngx_palloc(cf->pool, u->host.len + sizeof(":65536") - 1);
+        if (p == NULL) {
             return NGX_ERROR;
         }
 
-        u->addrs[0].name.len = ngx_sprintf(u->addrs[0].name.data, "%V:%d",
-                                           &u->host, u->portn)
-                                  - u->addrs[0].name.data;
+        u->addrs[0].name.len = ngx_sprintf(p, "%V:%d", &u->host, u->port) - p;
+        u->addrs[0].name.data = p;
     }
 
     return NGX_OK;