Mercurial > hg > nginx-quic
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 |