comparison src/stream/ngx_stream_proxy_module.c @ 8889:61d0fa67b55e quic

Merged with the default branch.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 03 Nov 2021 11:22:07 +0300
parents bfad703459b4
children c7e25324be11 b4c7853b0488
comparison
equal deleted inserted replaced
8888:6d1488b62dc5 8889:61d0fa67b55e
29 ngx_uint_t requests; 29 ngx_uint_t requests;
30 ngx_uint_t responses; 30 ngx_uint_t responses;
31 ngx_uint_t next_upstream_tries; 31 ngx_uint_t next_upstream_tries;
32 ngx_flag_t next_upstream; 32 ngx_flag_t next_upstream;
33 ngx_flag_t proxy_protocol; 33 ngx_flag_t proxy_protocol;
34 ngx_flag_t half_close;
34 ngx_stream_upstream_local_t *local; 35 ngx_stream_upstream_local_t *local;
35 ngx_flag_t socket_keepalive; 36 ngx_flag_t socket_keepalive;
36 37
37 #if (NGX_STREAM_SSL) 38 #if (NGX_STREAM_SSL)
38 ngx_flag_t ssl_enable; 39 ngx_flag_t ssl_enable;
243 ngx_conf_set_flag_slot, 244 ngx_conf_set_flag_slot,
244 NGX_STREAM_SRV_CONF_OFFSET, 245 NGX_STREAM_SRV_CONF_OFFSET,
245 offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol), 246 offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol),
246 NULL }, 247 NULL },
247 248
249 { ngx_string("proxy_half_close"),
250 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
251 ngx_conf_set_flag_slot,
252 NGX_STREAM_SRV_CONF_OFFSET,
253 offsetof(ngx_stream_proxy_srv_conf_t, half_close),
254 NULL },
255
248 #if (NGX_STREAM_SSL) 256 #if (NGX_STREAM_SSL)
249 257
250 { ngx_string("proxy_ssl"), 258 { ngx_string("proxy_ssl"),
251 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, 259 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
252 ngx_conf_set_flag_slot, 260 ngx_conf_set_flag_slot,
1753 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); 1761 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
1754 return; 1762 return;
1755 } 1763 }
1756 1764
1757 if (dst) { 1765 if (dst) {
1766
1767 if (dst->type == SOCK_STREAM && pscf->half_close
1768 && src->read->eof && !u->half_closed && !dst->buffered)
1769 {
1770 if (ngx_shutdown_socket(dst->fd, NGX_WRITE_SHUTDOWN) == -1) {
1771 ngx_connection_error(c, ngx_socket_errno,
1772 ngx_shutdown_socket_n " failed");
1773
1774 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
1775 return;
1776 }
1777
1778 u->half_closed = 1;
1779 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
1780 "stream proxy %s socket shutdown",
1781 from_upstream ? "client" : "upstream");
1782 }
1783
1758 if (ngx_handle_write_event(dst->write, 0) != NGX_OK) { 1784 if (ngx_handle_write_event(dst->write, 0) != NGX_OK) {
1759 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); 1785 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
1760 return; 1786 return;
1761 } 1787 }
1762 1788
1829 || (!c->read->eof && !pc->read->eof) 1855 || (!c->read->eof && !pc->read->eof)
1830 || (!c->read->eof && c->buffered) 1856 || (!c->read->eof && c->buffered)
1831 || (!pc->read->eof && pc->buffered)) 1857 || (!pc->read->eof && pc->buffered))
1832 { 1858 {
1833 return NGX_DECLINED; 1859 return NGX_DECLINED;
1860 }
1861
1862 if (pscf->half_close) {
1863 /* avoid closing live connections until both read ends get EOF */
1864 if (!(c->read->eof && pc->read->eof && !c->buffered && !pc->buffered)) {
1865 return NGX_DECLINED;
1866 }
1834 } 1867 }
1835 1868
1836 handler = c->log->handler; 1869 handler = c->log->handler;
1837 c->log->handler = NULL; 1870 c->log->handler = NULL;
1838 1871
2050 conf->next_upstream_tries = NGX_CONF_UNSET_UINT; 2083 conf->next_upstream_tries = NGX_CONF_UNSET_UINT;
2051 conf->next_upstream = NGX_CONF_UNSET; 2084 conf->next_upstream = NGX_CONF_UNSET;
2052 conf->proxy_protocol = NGX_CONF_UNSET; 2085 conf->proxy_protocol = NGX_CONF_UNSET;
2053 conf->local = NGX_CONF_UNSET_PTR; 2086 conf->local = NGX_CONF_UNSET_PTR;
2054 conf->socket_keepalive = NGX_CONF_UNSET; 2087 conf->socket_keepalive = NGX_CONF_UNSET;
2088 conf->half_close = NGX_CONF_UNSET;
2055 2089
2056 #if (NGX_STREAM_SSL) 2090 #if (NGX_STREAM_SSL)
2057 conf->ssl_enable = NGX_CONF_UNSET; 2091 conf->ssl_enable = NGX_CONF_UNSET;
2058 conf->ssl_session_reuse = NGX_CONF_UNSET; 2092 conf->ssl_session_reuse = NGX_CONF_UNSET;
2059 conf->ssl_name = NGX_CONF_UNSET_PTR; 2093 conf->ssl_name = NGX_CONF_UNSET_PTR;
2108 ngx_conf_merge_ptr_value(conf->local, prev->local, NULL); 2142 ngx_conf_merge_ptr_value(conf->local, prev->local, NULL);
2109 2143
2110 ngx_conf_merge_value(conf->socket_keepalive, 2144 ngx_conf_merge_value(conf->socket_keepalive,
2111 prev->socket_keepalive, 0); 2145 prev->socket_keepalive, 0);
2112 2146
2147 ngx_conf_merge_value(conf->half_close, prev->half_close, 0);
2148
2113 #if (NGX_STREAM_SSL) 2149 #if (NGX_STREAM_SSL)
2114 2150
2115 ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0); 2151 ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0);
2116 2152
2117 ngx_conf_merge_value(conf->ssl_session_reuse, 2153 ngx_conf_merge_value(conf->ssl_session_reuse,