comparison src/stream/ngx_stream_proxy_module.c @ 6610:d5b5866c06c4

Stream: got rid of pseudo variables. Stream limit_conn, upstream_hash and proxy modules now use complex values.
author Vladimir Homutov <vl@nginx.com>
date Wed, 29 Jun 2016 12:46:12 +0300
parents 2f41d383c9c7
children 9757cffc1e2f
comparison
equal deleted inserted replaced
6609:73543af69f14 6610:d5b5866c06c4
10 #include <ngx_stream.h> 10 #include <ngx_stream.h>
11 11
12 12
13 typedef struct { 13 typedef struct {
14 ngx_addr_t *addr; 14 ngx_addr_t *addr;
15 ngx_stream_complex_value_t *value;
15 #if (NGX_HAVE_TRANSPARENT_PROXY) 16 #if (NGX_HAVE_TRANSPARENT_PROXY)
16 unsigned transparent:1; 17 ngx_uint_t transparent; /* unsigned transparent:1; */
17 #endif 18 #endif
18 unsigned no_port:1;
19 } ngx_stream_upstream_local_t; 19 } ngx_stream_upstream_local_t;
20 20
21 21
22 typedef struct { 22 typedef struct {
23 ngx_msec_t connect_timeout; 23 ngx_msec_t connect_timeout;
446 446
447 static ngx_int_t 447 static ngx_int_t
448 ngx_stream_proxy_set_local(ngx_stream_session_t *s, ngx_stream_upstream_t *u, 448 ngx_stream_proxy_set_local(ngx_stream_session_t *s, ngx_stream_upstream_t *u,
449 ngx_stream_upstream_local_t *local) 449 ngx_stream_upstream_local_t *local)
450 { 450 {
451 ngx_addr_t *addr; 451 ngx_int_t rc;
452 ngx_connection_t *c; 452 ngx_str_t val;
453 ngx_addr_t *addr;
453 454
454 if (local == NULL) { 455 if (local == NULL) {
455 u->peer.local = NULL; 456 u->peer.local = NULL;
456 return NGX_OK; 457 return NGX_OK;
457 } 458 }
458 459
459 #if (NGX_HAVE_TRANSPARENT_PROXY) 460 #if (NGX_HAVE_TRANSPARENT_PROXY)
460 u->peer.transparent = local->transparent; 461 u->peer.transparent = local->transparent;
461 #endif 462 #endif
462 463
463 if (local->addr) { 464 if (local->value == NULL) {
464 u->peer.local = local->addr; 465 u->peer.local = local->addr;
465 return NGX_OK; 466 return NGX_OK;
466 } 467 }
467 468
468 /* $remote_addr, $remote_addr:$remote_port, [$remote_addr]:$remote_port */ 469 if (ngx_stream_complex_value(s, local->value, &val) != NGX_OK) {
469 470 return NGX_ERROR;
470 c = s->connection; 471 }
471 472
472 addr = ngx_palloc(c->pool, sizeof(ngx_addr_t)); 473 if (val.len == 0) {
474 return NGX_OK;
475 }
476
477 addr = ngx_palloc(s->connection->pool, sizeof(ngx_addr_t));
473 if (addr == NULL) { 478 if (addr == NULL) {
474 return NGX_ERROR; 479 return NGX_ERROR;
475 } 480 }
476 481
477 addr->socklen = c->socklen; 482 rc = ngx_parse_addr_port(s->connection->pool, addr, val.data, val.len);
478 483 if (rc == NGX_ERROR) {
479 if (local->no_port) { 484 return NGX_ERROR;
480 addr->sockaddr = ngx_palloc(c->pool, addr->socklen); 485 }
481 if (addr->sockaddr == NULL) { 486
482 return NGX_ERROR; 487 if (rc != NGX_OK) {
483 } 488 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
484 489 "invalid local address \"%V\"", &val);
485 ngx_memcpy(addr->sockaddr, c->sockaddr, c->socklen); 490 return NGX_OK;
486 ngx_inet_set_port(addr->sockaddr, 0); 491 }
487 492
488 } else { 493 addr->name = val;
489 addr->sockaddr = c->sockaddr;
490 }
491
492 addr->name = c->addr_text;
493 u->peer.local = addr; 494 u->peer.local = addr;
494 495
495 return NGX_OK; 496 return NGX_OK;
496 } 497 }
497 498
1697 static char * 1698 static char *
1698 ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) 1699 ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
1699 { 1700 {
1700 ngx_stream_proxy_srv_conf_t *pscf = conf; 1701 ngx_stream_proxy_srv_conf_t *pscf = conf;
1701 1702
1702 ngx_int_t rc; 1703 ngx_int_t rc;
1703 ngx_str_t *value; 1704 ngx_str_t *value;
1704 ngx_stream_upstream_local_t *local; 1705 ngx_stream_complex_value_t cv;
1706 ngx_stream_upstream_local_t *local;
1707 ngx_stream_compile_complex_value_t ccv;
1705 1708
1706 if (pscf->local != NGX_CONF_UNSET_PTR) { 1709 if (pscf->local != NGX_CONF_UNSET_PTR) {
1707 return "is duplicate"; 1710 return "is duplicate";
1708 } 1711 }
1709 1712
1712 if (cf->args->nelts == 2 && ngx_strcmp(value[1].data, "off") == 0) { 1715 if (cf->args->nelts == 2 && ngx_strcmp(value[1].data, "off") == 0) {
1713 pscf->local = NULL; 1716 pscf->local = NULL;
1714 return NGX_CONF_OK; 1717 return NGX_CONF_OK;
1715 } 1718 }
1716 1719
1720 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
1721
1722 ccv.cf = cf;
1723 ccv.value = &value[1];
1724 ccv.complex_value = &cv;
1725
1726 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
1727 return NGX_CONF_ERROR;
1728 }
1729
1717 local = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_local_t)); 1730 local = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_local_t));
1718 if (local == NULL) { 1731 if (local == NULL) {
1719 return NGX_CONF_ERROR; 1732 return NGX_CONF_ERROR;
1720 } 1733 }
1721 1734
1722 pscf->local = local; 1735 pscf->local = local;
1723 1736
1724 if (ngx_strcmp(value[1].data, "$remote_addr") == 0) { 1737 if (cv.lengths) {
1725 local->no_port = 1; 1738 local->value = ngx_palloc(cf->pool, sizeof(ngx_stream_complex_value_t));
1726 1739 if (local->value == NULL) {
1727 } else if (ngx_strcmp(value[1].data, "$remote_addr:$remote_port") != 0 1740 return NGX_CONF_ERROR;
1728 && ngx_strcmp(value[1].data, "[$remote_addr]:$remote_port") != 0) 1741 }
1729 { 1742
1743 *local->value = cv;
1744
1745 } else {
1730 local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t)); 1746 local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
1731 if (local->addr == NULL) { 1747 if (local->addr == NULL) {
1732 return NGX_CONF_ERROR; 1748 return NGX_CONF_ERROR;
1733 } 1749 }
1734 1750