]> git.kaiwu.me - nginx.git/commitdiff
Fixed "proxy_pass" with IP address and no port (ticket #276).
authorRuslan Ermilov <ru@nginx.com>
Thu, 10 Jan 2013 12:58:55 +0000 (12:58 +0000)
committerRuslan Ermilov <ru@nginx.com>
Thu, 10 Jan 2013 12:58:55 +0000 (12:58 +0000)
Upstreams created by "proxy_pass" with IP address and no port were
broken in 1.3.10, by not initializing port in u->sockaddr.

API change: ngx_parse_url() was modified to always initialize port
(in u->sockaddr and in u->port), even for the u->no_resolve case;
ngx_http_upstream() and ngx_http_upstream_add() were adopted.

src/core/ngx_inet.c
src/http/ngx_http_upstream.c
src/http/ngx_http_upstream.h
src/http/ngx_http_upstream_round_robin.c

index 9aec68964bdb4e7ce778e536a46d24fd1d88c4ff..7757ab7d9053d96b450e809b30905be2d2429406 100644 (file)
@@ -707,11 +707,8 @@ ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)
         }
 
         u->no_port = 1;
-
-        if (!u->no_resolve) {
-            u->port = u->default_port;
-            sin->sin_port = htons(u->default_port);
-        }
+        u->port = u->default_port;
+        sin->sin_port = htons(u->default_port);
     }
 
     len = last - host;
@@ -868,11 +865,8 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)
 
         } else {
             u->no_port = 1;
-
-            if (!u->no_resolve) {
-                u->port = u->default_port;
-                sin6->sin6_port = htons(u->default_port);
-            }
+            u->port = u->default_port;
+            sin6->sin6_port = htons(u->default_port);
         }
     }
 
index 3436c6b1d94579cab76beb268d33363b82c3b5f8..fb9c086738e5c633f0687de12cfbbba2eba1c636 100644 (file)
@@ -4121,6 +4121,7 @@ ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
     value = cf->args->elts;
     u.host = value[1];
     u.no_resolve = 1;
+    u.no_port = 1;
 
     uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE
                                          |NGX_HTTP_UPSTREAM_WEIGHT
@@ -4391,14 +4392,14 @@ ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)
             return NULL;
         }
 
-        if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && u->port) {
+        if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) {
             ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
                                "upstream \"%V\" may not have port %d",
                                &u->host, u->port);
             return NULL;
         }
 
-        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && uscfp[i]->port) {
+        if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) {
             ngx_log_error(NGX_LOG_WARN, cf->log, 0,
                           "upstream \"%V\" may not have port %d in %s:%ui",
                           &u->host, uscfp[i]->port,
@@ -4406,7 +4407,9 @@ ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)
             return NULL;
         }
 
-        if (uscfp[i]->port != u->port) {
+        if (uscfp[i]->port && u->port
+            && uscfp[i]->port != u->port)
+        {
             continue;
         }
 
@@ -4434,6 +4437,7 @@ ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)
     uscf->line = cf->conf_file->line;
     uscf->port = u->port;
     uscf->default_port = u->default_port;
+    uscf->no_port = u->no_port;
 
     if (u->naddrs == 1) {
         uscf->servers = ngx_array_create(cf->pool, 1,
index f32c98522695c30a3fa2a5f4ce1a3ef6860b537e..0d2b738a96dc33a982ea70a7d257eed9fe26cccf 100644 (file)
@@ -116,6 +116,7 @@ struct ngx_http_upstream_srv_conf_s {
     ngx_uint_t                       line;
     in_port_t                        port;
     in_port_t                        default_port;
+    ngx_uint_t                       no_port;  /* unsigned no_port:1 */
 };
 
 
index 61dce69cb3ed0ecb7f2cac1949c484e1662558f5..b4803941400519de44c86e1208c71d7bafbbd83e 100644 (file)
@@ -161,7 +161,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
 
     /* an upstream implicitly defined by proxy_pass, etc. */
 
-    if (us->port == 0 && us->default_port == 0) {
+    if (us->port == 0) {
         ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
                       "no port in upstream \"%V\" in %s:%ui",
                       &us->host, us->file_name, us->line);
@@ -171,7 +171,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
     ngx_memzero(&u, sizeof(ngx_url_t));
 
     u.host = us->host;
-    u.port = (in_port_t) (us->port ? us->port : us->default_port);
+    u.port = us->port;
 
     if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {
         if (u.err) {