comparison src/stream/ngx_stream_proxy_module.c @ 6595:0c98c4092440

Stream: support for $remote_port in proxy_bind. The following two types of bind addresses are supported in addition to $remote_addr and address literals: - $remote_addr:$remote_port - [$remote_addr]:$remote_port In both cases client remote address with port is used in upstream socket bind.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 20 Jun 2016 11:50:44 +0300
parents 3c87b82b17d4
children 4a724d6006ee
comparison
equal deleted inserted replaced
6594:3c87b82b17d4 6595:0c98c4092440
11 11
12 12
13 typedef struct { 13 typedef struct {
14 ngx_addr_t *addr; 14 ngx_addr_t *addr;
15 #if (NGX_HAVE_TRANSPARENT_PROXY) 15 #if (NGX_HAVE_TRANSPARENT_PROXY)
16 ngx_uint_t transparent; /* unsigned transparent:1; */ 16 unsigned transparent:1;
17 #endif 17 #endif
18 unsigned no_port:1;
18 } ngx_stream_upstream_local_t; 19 } ngx_stream_upstream_local_t;
19 20
20 21
21 typedef struct { 22 typedef struct {
22 ngx_msec_t connect_timeout; 23 ngx_msec_t connect_timeout;
461 if (local->addr) { 462 if (local->addr) {
462 u->peer.local = local->addr; 463 u->peer.local = local->addr;
463 return NGX_OK; 464 return NGX_OK;
464 } 465 }
465 466
466 /* $remote_addr */ 467 /* $remote_addr, $remote_addr:$remote_port, [$remote_addr]:$remote_port */
467 468
468 c = s->connection; 469 c = s->connection;
469 470
470 addr = ngx_palloc(c->pool, sizeof(ngx_addr_t)); 471 addr = ngx_palloc(c->pool, sizeof(ngx_addr_t));
471 if (addr == NULL) { 472 if (addr == NULL) {
472 return NGX_ERROR; 473 return NGX_ERROR;
473 } 474 }
474 475
475 addr->socklen = c->socklen; 476 addr->socklen = c->socklen;
476 477
477 addr->sockaddr = ngx_palloc(c->pool, addr->socklen); 478 if (local->no_port) {
478 if (addr->sockaddr == NULL) { 479 addr->sockaddr = ngx_palloc(c->pool, addr->socklen);
479 return NGX_ERROR; 480 if (addr->sockaddr == NULL) {
480 } 481 return NGX_ERROR;
481 482 }
482 ngx_memcpy(addr->sockaddr, c->sockaddr, c->socklen); 483
483 ngx_inet_set_port(addr->sockaddr, 0); 484 ngx_memcpy(addr->sockaddr, c->sockaddr, c->socklen);
485 ngx_inet_set_port(addr->sockaddr, 0);
486
487 } else {
488 addr->sockaddr = c->sockaddr;
489 }
484 490
485 addr->name = c->addr_text; 491 addr->name = c->addr_text;
486 u->peer.local = addr; 492 u->peer.local = addr;
487 493
488 return NGX_OK; 494 return NGX_OK;
1712 return NGX_CONF_ERROR; 1718 return NGX_CONF_ERROR;
1713 } 1719 }
1714 1720
1715 pscf->local = local; 1721 pscf->local = local;
1716 1722
1717 if (ngx_strcmp(value[1].data, "$remote_addr") != 0) { 1723 if (ngx_strcmp(value[1].data, "$remote_addr") == 0) {
1724 local->no_port = 1;
1725
1726 } else if (ngx_strcmp(value[1].data, "$remote_addr:$remote_port") != 0
1727 && ngx_strcmp(value[1].data, "[$remote_addr]:$remote_port") != 0)
1728 {
1718 local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t)); 1729 local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
1719 if (local->addr == NULL) { 1730 if (local->addr == NULL) {
1720 return NGX_CONF_ERROR; 1731 return NGX_CONF_ERROR;
1721 } 1732 }
1722 1733