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