mirror of
				https://github.com/openresty/openresty.git
				synced 2024-10-13 00:29:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			172 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| diff --git a/src/stream/ngx_stream.h b/src/stream/ngx_stream.h
 | |
| index 09d24593..a4dda5da 100644
 | |
| --- a/src/stream/ngx_stream.h
 | |
| +++ b/src/stream/ngx_stream.h
 | |
| @@ -241,6 +241,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
 | |
| @@ -294,6 +303,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 818d7329..32bfd79f 100644
 | |
| --- a/src/stream/ngx_stream_proxy_module.c
 | |
| +++ b/src/stream/ngx_stream_proxy_module.c
 | |
| @@ -359,6 +359,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;
 | |
|  
 | |
| @@ -367,6 +368,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);
 | |
| @@ -654,6 +666,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;
 | |
|  
 | |
| @@ -661,6 +674,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;
 | |
| @@ -722,7 +737,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);
 | |
|  }
 | |
|  
 | |
|  
 | |
| @@ -900,8 +915,10 @@ ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s)
 | |
|      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_MAX_HEADER];
 | |
| +    ngx_stream_proxy_ctx_t       *ctx;
 | |
| +
 | |
| +    ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module);
 | |
|  
 | |
|      c = s->connection;
 | |
|  
 | |
| @@ -928,9 +945,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;
 | |
|  
 | |
| @@ -994,6 +1009,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;
 | |
|  
 | |
| @@ -1029,7 +1047,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;
 | |
| @@ -1285,6 +1303,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;
 | |
| @@ -1296,6 +1315,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;
 | |
|  
 | |
| @@ -1315,7 +1336,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;
 | |
| @@ -1461,6 +1482,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;
 | |
|  
 | |
| @@ -1652,7 +1676,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);
 |