changeset 2573:1374ffff9635

fix $server_addr for wildcard listen, the has been introduced in r2513
author Igor Sysoev <igor@sysoev.ru>
date Wed, 18 Mar 2009 12:23:57 +0000
parents 9c42c19f364a
children 7503d95d6ead
files src/http/ngx_http_core_module.c src/http/ngx_http_request.c
diffstat 2 files changed, 29 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -1791,13 +1791,38 @@ ngx_http_auth_basic_user(ngx_http_reques
 ngx_int_t
 ngx_http_server_addr(ngx_http_request_t *r, ngx_str_t *s)
 {
-    socklen_t            len;
-    ngx_connection_t    *c;
-    u_char               sa[NGX_SOCKADDRLEN];
+    socklen_t             len;
+    ngx_uint_t            addr;
+    ngx_connection_t     *c;
+    u_char                sa[NGX_SOCKADDRLEN];
+    struct sockaddr_in   *sin;
+#if (NGX_HAVE_INET6)
+    ngx_uint_t            i;
+    struct sockaddr_in6  *sin6;
+#endif
 
     c = r->connection;
 
-    if (c->local_sockaddr == NULL) {
+    switch (c->local_sockaddr->sa_family) {
+
+#if (NGX_HAVE_INET6)
+    case AF_INET6:
+        sin6 = (struct sockaddr_in6 *) c->local_sockaddr;
+
+        for (addr = 0, i = 0; addr == 0 && i < 16; i++) {
+            addr |= sin6->sin6_addr.s6_addr[i];
+        }
+
+        break;
+#endif
+
+    default: /* AF_INET */
+        sin = (struct sockaddr_in *) c->local_sockaddr;
+        addr = sin->sin_addr.s_addr;
+        break;
+    }
+
+    if (addr == 0) {
 
         len = NGX_SOCKADDRLEN;
 
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -310,8 +310,6 @@ ngx_http_init_request(ngx_event_t *rev)
          * is required to determine a server address
          */
 
-        c->local_sockaddr = NULL;
-
         if (ngx_http_server_addr(r, NULL) != NGX_OK) {
             ngx_http_close_connection(c);
             return;