diff --git a/src/stream/ngx_stream.h b/src/stream/ngx_stream.h index dc05dc5ba..3b76e0117 100644 --- a/src/stream/ngx_stream.h +++ b/src/stream/ngx_stream.h @@ -311,6 +311,15 @@ typedef struct { } ngx_stream_module_t; +typedef struct { + ngx_msec_t connect_timeout; + ngx_msec_t timeout; +} ngx_stream_proxy_ctx_t; + + +#define NGX_STREAM_HAVE_PROXY_TIMEOUT_FIELDS_PATCH 1 + + #define NGX_STREAM_MODULE 0x4d525453 /* "STRM" */ #define NGX_STREAM_MAIN_CONF 0x02000000 @@ -371,6 +380,7 @@ void ngx_stream_finalize_session(ngx_stream_session_t *s, ngx_uint_t rc); extern ngx_module_t ngx_stream_module; extern ngx_uint_t ngx_stream_max_module; extern ngx_module_t ngx_stream_core_module; +extern ngx_module_t ngx_stream_proxy_module; typedef ngx_int_t (*ngx_stream_filter_pt)(ngx_stream_session_t *s, diff --git a/src/stream/ngx_stream_proxy_module.c b/src/stream/ngx_stream_proxy_module.c index 6e51585f6..0dbbc5af6 100644 --- a/src/stream/ngx_stream_proxy_module.c +++ b/src/stream/ngx_stream_proxy_module.c @@ -414,6 +414,7 @@ ngx_stream_proxy_handler(ngx_stream_session_t *s) ngx_stream_proxy_srv_conf_t *pscf; ngx_stream_upstream_srv_conf_t *uscf, **uscfp; ngx_stream_upstream_main_conf_t *umcf; + ngx_stream_proxy_ctx_t *pctx; c = s->connection; @@ -422,6 +423,17 @@ ngx_stream_proxy_handler(ngx_stream_session_t *s) ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, "proxy connection handler"); + pctx = ngx_palloc(c->pool, sizeof(ngx_stream_proxy_ctx_t)); + if (pctx == NULL) { + ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); + return; + } + + pctx->connect_timeout = pscf->connect_timeout; + pctx->timeout = pscf->timeout; + + ngx_stream_set_ctx(s, pctx, ngx_stream_proxy_module); + u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t)); if (u == NULL) { ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); @@ -713,6 +725,7 @@ ngx_stream_proxy_connect(ngx_stream_session_t *s) ngx_connection_t *c, *pc; ngx_stream_upstream_t *u; ngx_stream_proxy_srv_conf_t *pscf; + ngx_stream_proxy_ctx_t *ctx; c = s->connection; @@ -720,6 +733,8 @@ ngx_stream_proxy_connect(ngx_stream_session_t *s) pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); + ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); + u = s->upstream; u->connected = 0; @@ -802,7 +817,7 @@ ngx_stream_proxy_connect(ngx_stream_session_t *s) pc->read->handler = ngx_stream_proxy_connect_handler; pc->write->handler = ngx_stream_proxy_connect_handler; - ngx_add_timer(pc->write, pscf->connect_timeout); + ngx_add_timer(pc->write, ctx->connect_timeout); } @@ -973,12 +988,14 @@ ngx_stream_proxy_init_upstream(ngx_stream_session_t *s) static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s) { - u_char *p; - ssize_t n, size; - ngx_connection_t *c, *pc; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - u_char buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER]; + u_char *p; + u_char buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER]; + ssize_t n, size; + ngx_connection_t *c, *pc; + ngx_stream_upstream_t *u; + ngx_stream_proxy_ctx_t *ctx; + + ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); c = s->connection; @@ -1006,9 +1023,7 @@ ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s) return NGX_ERROR; } - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - ngx_add_timer(pc->write, pscf->timeout); + ngx_add_timer(pc->write, ctx->timeout); pc->write->handler = ngx_stream_proxy_connect_handler; @@ -1177,6 +1192,9 @@ ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s) ngx_connection_t *pc; ngx_stream_upstream_t *u; ngx_stream_proxy_srv_conf_t *pscf; + ngx_stream_proxy_ctx_t *ctx; + + ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); u = s->upstream; @@ -1225,7 +1243,7 @@ ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s) if (rc == NGX_AGAIN) { if (!pc->write->timer_set) { - ngx_add_timer(pc->write, pscf->connect_timeout); + ngx_add_timer(pc->write, ctx->connect_timeout); } pc->ssl->handler = ngx_stream_proxy_ssl_handshake; @@ -1535,6 +1553,7 @@ ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream) ngx_stream_session_t *s; ngx_stream_upstream_t *u; ngx_stream_proxy_srv_conf_t *pscf; + ngx_stream_proxy_ctx_t *ctx; c = ev->data; s = c->data; @@ -1546,6 +1565,8 @@ ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream) return; } + ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); + c = s->connection; pc = u->peer.connection; @@ -1565,7 +1586,7 @@ ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream) } if (u->connected && !c->read->delayed && !pc->read->delayed) { - ngx_add_timer(c->write, pscf->timeout); + ngx_add_timer(c->write, ctx->timeout); } return; @@ -1727,6 +1748,9 @@ ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream, ngx_log_handler_pt handler; ngx_stream_upstream_t *u; ngx_stream_proxy_srv_conf_t *pscf; + ngx_stream_proxy_ctx_t *ctx; + + ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); u = s->upstream; @@ -1918,7 +1942,7 @@ ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream, } if (!c->read->delayed && !pc->read->delayed) { - ngx_add_timer(c->write, pscf->timeout); + ngx_add_timer(c->write, ctx->timeout); } else if (c->write->timer_set) { ngx_del_timer(c->write);