Vladimir Homutov
2018-11-13 13:41:23 UTC
details: http://hg.nginx.org/nginx/rev/04ff25798002
branches:
changeset: 7392:04ff25798002
user: Vladimir Homutov <***@nginx.com>
date: Mon Nov 12 12:05:03 2018 +0300
description:
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.
diffstat:
src/stream/ngx_stream_proxy_module.c | 114 +++++++++++++++++++++++-----------
1 files changed, 76 insertions(+), 38 deletions(-)
diffs (138 lines):
diff -r 27559d4a5151 -r 04ff25798002 src/stream/ngx_stream_proxy_module.c
--- a/src/stream/ngx_stream_proxy_module.c Wed Nov 07 13:22:14 2018 +0300
+++ b/src/stream/ngx_stream_proxy_module.c Mon Nov 12 12:05:03 2018 +0300
@@ -73,6 +73,8 @@ static void ngx_stream_proxy_connect_han
static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
static void ngx_stream_proxy_process(ngx_stream_session_t *s,
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_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,
@@ -1646,44 +1648,7 @@ ngx_stream_proxy_process(ngx_stream_sess
c->log->action = "proxying connection";
- if (c->type == SOCK_DGRAM
- && 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);
+ if (ngx_stream_proxy_test_finalize(s, from_upstream) == NGX_OK) {
return;
}
@@ -1710,6 +1675,79 @@ ngx_stream_proxy_process(ngx_stream_sess
}
+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
ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)
{
branches:
changeset: 7392:04ff25798002
user: Vladimir Homutov <***@nginx.com>
date: Mon Nov 12 12:05:03 2018 +0300
description:
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.
diffstat:
src/stream/ngx_stream_proxy_module.c | 114 +++++++++++++++++++++++-----------
1 files changed, 76 insertions(+), 38 deletions(-)
diffs (138 lines):
diff -r 27559d4a5151 -r 04ff25798002 src/stream/ngx_stream_proxy_module.c
--- a/src/stream/ngx_stream_proxy_module.c Wed Nov 07 13:22:14 2018 +0300
+++ b/src/stream/ngx_stream_proxy_module.c Mon Nov 12 12:05:03 2018 +0300
@@ -73,6 +73,8 @@ static void ngx_stream_proxy_connect_han
static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
static void ngx_stream_proxy_process(ngx_stream_session_t *s,
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_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,
@@ -1646,44 +1648,7 @@ ngx_stream_proxy_process(ngx_stream_sess
c->log->action = "proxying connection";
- if (c->type == SOCK_DGRAM
- && 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);
+ if (ngx_stream_proxy_test_finalize(s, from_upstream) == NGX_OK) {
return;
}
@@ -1710,6 +1675,79 @@ ngx_stream_proxy_process(ngx_stream_sess
}
+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
ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)
{