mirror of
https://github.com/nginx/nginx.git
synced 2024-12-03 21:18:59 +08:00
Stream: session completion check code moved to a separate function.
The code refactored to simplify the ngx_stream_proxy_process() function and facilitate adding new session termination conditions.
This commit is contained in:
parent
7e3041b79f
commit
abf04ed87a
@ -73,6 +73,8 @@ static void ngx_stream_proxy_connect_handler(ngx_event_t *ev);
|
|||||||
static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
|
static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
|
||||||
static void ngx_stream_proxy_process(ngx_stream_session_t *s,
|
static void ngx_stream_proxy_process(ngx_stream_session_t *s,
|
||||||
ngx_uint_t from_upstream, ngx_uint_t do_write);
|
ngx_uint_t from_upstream, ngx_uint_t do_write);
|
||||||
|
static ngx_int_t ngx_stream_proxy_test_finalize(ngx_stream_session_t *s,
|
||||||
|
ngx_uint_t from_upstream);
|
||||||
static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);
|
static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);
|
||||||
static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc);
|
static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc);
|
||||||
static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,
|
static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,
|
||||||
@ -1646,44 +1648,7 @@ ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream,
|
|||||||
|
|
||||||
c->log->action = "proxying connection";
|
c->log->action = "proxying connection";
|
||||||
|
|
||||||
if (c->type == SOCK_DGRAM
|
if (ngx_stream_proxy_test_finalize(s, from_upstream) == NGX_OK) {
|
||||||
&& pscf->responses != NGX_MAX_INT32_VALUE
|
|
||||||
&& u->responses >= pscf->responses * u->requests
|
|
||||||
&& !src->buffered && dst && !dst->buffered)
|
|
||||||
{
|
|
||||||
handler = c->log->handler;
|
|
||||||
c->log->handler = NULL;
|
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
|
||||||
"udp done"
|
|
||||||
", packets from/to client:%ui/%ui"
|
|
||||||
", bytes from/to client:%O/%O"
|
|
||||||
", bytes from/to upstream:%O/%O",
|
|
||||||
u->requests, u->responses,
|
|
||||||
s->received, c->sent, u->received, pc ? pc->sent : 0);
|
|
||||||
|
|
||||||
c->log->handler = handler;
|
|
||||||
|
|
||||||
ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c->type == SOCK_STREAM
|
|
||||||
&& src->read->eof && dst && (dst->read->eof || !dst->buffered))
|
|
||||||
{
|
|
||||||
handler = c->log->handler;
|
|
||||||
c->log->handler = NULL;
|
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
|
||||||
"%s disconnected"
|
|
||||||
", bytes from/to client:%O/%O"
|
|
||||||
", bytes from/to upstream:%O/%O",
|
|
||||||
from_upstream ? "upstream" : "client",
|
|
||||||
s->received, c->sent, u->received, pc ? pc->sent : 0);
|
|
||||||
|
|
||||||
c->log->handler = handler;
|
|
||||||
|
|
||||||
ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1710,6 +1675,79 @@ ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_stream_proxy_test_finalize(ngx_stream_session_t *s,
|
||||||
|
ngx_uint_t from_upstream)
|
||||||
|
{
|
||||||
|
ngx_connection_t *c, *pc;
|
||||||
|
ngx_log_handler_pt handler;
|
||||||
|
ngx_stream_upstream_t *u;
|
||||||
|
ngx_stream_proxy_srv_conf_t *pscf;
|
||||||
|
|
||||||
|
pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
|
||||||
|
|
||||||
|
c = s->connection;
|
||||||
|
u = s->upstream;
|
||||||
|
pc = u->connected ? u->peer.connection : NULL;
|
||||||
|
|
||||||
|
if (c->type == SOCK_DGRAM) {
|
||||||
|
|
||||||
|
if (pscf->responses == NGX_MAX_INT32_VALUE
|
||||||
|
|| u->responses < pscf->responses * u->requests)
|
||||||
|
{
|
||||||
|
return NGX_DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pc == NULL || c->buffered || pc->buffered) {
|
||||||
|
return NGX_DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler = c->log->handler;
|
||||||
|
c->log->handler = NULL;
|
||||||
|
|
||||||
|
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||||
|
"udp done"
|
||||||
|
", packets from/to client:%ui/%ui"
|
||||||
|
", bytes from/to client:%O/%O"
|
||||||
|
", bytes from/to upstream:%O/%O",
|
||||||
|
u->requests, u->responses,
|
||||||
|
s->received, c->sent, u->received, pc ? pc->sent : 0);
|
||||||
|
|
||||||
|
c->log->handler = handler;
|
||||||
|
|
||||||
|
ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* c->type == SOCK_STREAM */
|
||||||
|
|
||||||
|
if (pc == NULL
|
||||||
|
|| (!c->read->eof && !pc->read->eof)
|
||||||
|
|| (!c->read->eof && c->buffered)
|
||||||
|
|| (!pc->read->eof && pc->buffered))
|
||||||
|
{
|
||||||
|
return NGX_DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler = c->log->handler;
|
||||||
|
c->log->handler = NULL;
|
||||||
|
|
||||||
|
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||||
|
"%s disconnected"
|
||||||
|
", bytes from/to client:%O/%O"
|
||||||
|
", bytes from/to upstream:%O/%O",
|
||||||
|
from_upstream ? "upstream" : "client",
|
||||||
|
s->received, c->sent, u->received, pc ? pc->sent : 0);
|
||||||
|
|
||||||
|
c->log->handler = handler;
|
||||||
|
|
||||||
|
ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)
|
ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user