annotate src/stream/ngx_stream_handler.c @ 7690:8253424d1aff

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents 3908156a51fa
children 893b3313f53c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_event.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11 #include <ngx_stream.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
14 static void ngx_stream_log_session(ngx_stream_session_t *s);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
15 static void ngx_stream_close_connection(ngx_connection_t *c);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
16 static u_char *ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len);
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
17 static void ngx_stream_proxy_protocol_handler(ngx_event_t *rev);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
18
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
19
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
20 void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21 ngx_stream_init_connection(ngx_connection_t *c)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22 {
6175
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
23 u_char text[NGX_SOCKADDR_STRLEN];
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
24 size_t len;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
25 ngx_uint_t i;
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
26 ngx_time_t *tp;
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
27 ngx_event_t *rev;
6175
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
28 struct sockaddr *sa;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
29 ngx_stream_port_t *port;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
30 struct sockaddr_in *sin;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
31 ngx_stream_in_addr_t *addr;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
32 ngx_stream_session_t *s;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
33 ngx_stream_addr_conf_t *addr_conf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34 #if (NGX_HAVE_INET6)
6175
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
35 struct sockaddr_in6 *sin6;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
36 ngx_stream_in6_addr_t *addr6;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37 #endif
6175
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
38 ngx_stream_core_srv_conf_t *cscf;
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
39 ngx_stream_core_main_conf_t *cmcf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 /* find the server configuration for the address:port */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 port = c->listening->servers;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 if (port->naddrs > 1) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48 * There are several addresses on this port and one of them
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 * is the "*:port" wildcard so getsockname() is needed to determine
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 * the server address.
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 *
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6223
diff changeset
52 * AcceptEx() and recvmsg() already gave this address.
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55 if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 ngx_stream_close_connection(c);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60 sa = c->local_sockaddr;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62 switch (sa->sa_family) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 #if (NGX_HAVE_INET6)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 case AF_INET6:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 sin6 = (struct sockaddr_in6 *) sa;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
68 addr6 = port->addrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
69
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
70 /* the last address is "*" */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
71
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72 for (i = 0; i < port->naddrs - 1; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
73 if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 addr_conf = &addr6[i].conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
80 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83 default: /* AF_INET */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
84 sin = (struct sockaddr_in *) sa;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
85
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
86 addr = port->addrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
87
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
88 /* the last address is "*" */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
89
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
90 for (i = 0; i < port->naddrs - 1; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
91 if (addr[i].addr == sin->sin_addr.s_addr) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
92 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
93 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
94 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
95
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
96 addr_conf = &addr[i].conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
97
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
98 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
99 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102 switch (c->local_sockaddr->sa_family) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104 #if (NGX_HAVE_INET6)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105 case AF_INET6:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 addr6 = port->addrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107 addr_conf = &addr6[0].conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
110
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
111 default: /* AF_INET */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
112 addr = port->addrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113 addr_conf = &addr[0].conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118 s = ngx_pcalloc(c->pool, sizeof(ngx_stream_session_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119 if (s == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
120 ngx_stream_close_connection(c);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
121 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
122 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
123
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
124 s->signature = NGX_STREAM_MODULE;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
125 s->main_conf = addr_conf->ctx->main_conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
126 s->srv_conf = addr_conf->ctx->srv_conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
128 #if (NGX_STREAM_SSL)
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
129 s->ssl = addr_conf->ssl;
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
130 #endif
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
131
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6684
diff changeset
132 if (c->buffer) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6684
diff changeset
133 s->received += c->buffer->last - c->buffer->pos;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6684
diff changeset
134 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6684
diff changeset
135
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
136 s->connection = c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
137 c->data = s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
138
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
139 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
140
6129
187aa751ad62 Core: the ngx_set_connection_log() macro.
Vladimir Homutov <vl@nginx.com>
parents: 6115
diff changeset
141 ngx_set_connection_log(c, cscf->error_log);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
142
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
143 len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
144
6461
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
145 ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA %sclient %*s connected to %V",
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
146 c->number, c->type == SOCK_DGRAM ? "udp " : "",
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
147 len, text, &addr_conf->addr_text);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
148
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149 c->log->connection = c->number;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150 c->log->handler = ngx_stream_log_error;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151 c->log->data = s;
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
152 c->log->action = "initializing session";
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 c->log_error = NGX_ERROR_INFO;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154
6682
db422604ceb0 Stream: allow using the session context inside handlers.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
155 s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_stream_max_module);
db422604ceb0 Stream: allow using the session context inside handlers.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
156 if (s->ctx == NULL) {
db422604ceb0 Stream: allow using the session context inside handlers.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
157 ngx_stream_close_connection(c);
db422604ceb0 Stream: allow using the session context inside handlers.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
158 return;
db422604ceb0 Stream: allow using the session context inside handlers.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
159 }
db422604ceb0 Stream: allow using the session context inside handlers.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
160
6175
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
161 cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
8807a2369b1a Stream: access module.
Vladimir Homutov <vl@nginx.com>
parents: 6129
diff changeset
162
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
163 s->variables = ngx_pcalloc(s->connection->pool,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
164 cmcf->variables.nelts
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
165 * sizeof(ngx_stream_variable_value_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
166
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
167 if (s->variables == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
168 ngx_stream_close_connection(c);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
169 return;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
170 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6461
diff changeset
171
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
172 tp = ngx_timeofday();
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
173 s->start_sec = tp->sec;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
174 s->start_msec = tp->msec;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
175
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
176 rev = c->read;
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
177 rev->handler = ngx_stream_session_handler;
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
178
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
179 if (addr_conf->proxy_protocol) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
180 c->log->action = "reading PROXY protocol";
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
181
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
182 rev->handler = ngx_stream_proxy_protocol_handler;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
183
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
184 if (!rev->ready) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
185 ngx_add_timer(rev, cscf->proxy_protocol_timeout);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
186
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
187 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
188 ngx_stream_finalize_session(s,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
189 NGX_STREAM_INTERNAL_SERVER_ERROR);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
190 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
191
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
192 return;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
193 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
194 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
195
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
196 if (ngx_use_accept_mutex) {
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
197 ngx_post_event(rev, &ngx_posted_events);
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
198 return;
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
199 }
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
200
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
201 rev->handler(rev);
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
202 }
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
203
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
204
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
205 static void
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
206 ngx_stream_proxy_protocol_handler(ngx_event_t *rev)
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
207 {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
208 u_char *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER];
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
209 size_t size;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
210 ssize_t n;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
211 ngx_err_t err;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
212 ngx_connection_t *c;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
213 ngx_stream_session_t *s;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
214 ngx_stream_core_srv_conf_t *cscf;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
215
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
216 c = rev->data;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
217 s = c->data;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
218
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
219 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
220 "stream PROXY protocol handler");
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
221
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
222 if (rev->timedout) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
223 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
224 ngx_stream_finalize_session(s, NGX_STREAM_OK);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
225 return;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
226 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
227
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
228 n = recv(c->fd, (char *) buf, sizeof(buf), MSG_PEEK);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
229
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
230 err = ngx_socket_errno;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
231
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
232 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "recv(): %z", n);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
233
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
234 if (n == -1) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
235 if (err == NGX_EAGAIN) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
236 rev->ready = 0;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
237
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
238 if (!rev->timer_set) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
239 cscf = ngx_stream_get_module_srv_conf(s,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
240 ngx_stream_core_module);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
241
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
242 ngx_add_timer(rev, cscf->proxy_protocol_timeout);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
243 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
244
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
245 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
246 ngx_stream_finalize_session(s,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
247 NGX_STREAM_INTERNAL_SERVER_ERROR);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
248 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
249
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
250 return;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
251 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
252
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
253 ngx_connection_error(c, err, "recv() failed");
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
254
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
255 ngx_stream_finalize_session(s, NGX_STREAM_OK);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
256 return;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
257 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
258
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
259 if (rev->timer_set) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
260 ngx_del_timer(rev);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
261 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
262
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
263 p = ngx_proxy_protocol_read(c, buf, buf + n);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
264
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
265 if (p == NULL) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
266 ngx_stream_finalize_session(s, NGX_STREAM_BAD_REQUEST);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
267 return;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
268 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
269
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
270 size = p - buf;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
271
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
272 if (c->recv(c, buf, size) != (ssize_t) size) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
273 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
274 return;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
275 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
276
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
277 c->log->action = "initializing session";
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
278
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
279 ngx_stream_session_handler(rev);
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
280 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
281
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6679
diff changeset
282
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
283 void
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
284 ngx_stream_session_handler(ngx_event_t *rev)
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
285 {
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
286 ngx_connection_t *c;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
287 ngx_stream_session_t *s;
6679
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
288
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
289 c = rev->data;
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
290 s = c->data;
40e8ce405859 Stream: postpone session initialization under accept mutex.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6678
diff changeset
291
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
292 ngx_stream_core_run_phases(s);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
293 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
294
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
295
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
296 void
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
297 ngx_stream_finalize_session(ngx_stream_session_t *s, ngx_uint_t rc)
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
298 {
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
299 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
300 "finalize stream session: %i", rc);
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
301
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
302 s->status = rc;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
303
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
304 ngx_stream_log_session(s);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
305
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
306 ngx_stream_close_connection(s->connection);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
307 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
308
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
309
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
310 static void
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
311 ngx_stream_log_session(ngx_stream_session_t *s)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
312 {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
313 ngx_uint_t i, n;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
314 ngx_stream_handler_pt *log_handler;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
315 ngx_stream_core_main_conf_t *cmcf;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
316
6678
0125b151c9a5 Stream: log module.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
317 cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
0125b151c9a5 Stream: log module.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
318
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
319 log_handler = cmcf->phases[NGX_STREAM_LOG_PHASE].handlers.elts;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
320 n = cmcf->phases[NGX_STREAM_LOG_PHASE].handlers.nelts;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
321
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
322 for (i = 0; i < n; i++) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6692
diff changeset
323 log_handler[i](s);
6678
0125b151c9a5 Stream: log module.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
324 }
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
325 }
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
326
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
327
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6669
diff changeset
328 static void
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
329 ngx_stream_close_connection(ngx_connection_t *c)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
330 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
331 ngx_pool_t *pool;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
332
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
333 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
334 "close stream connection: %d", c->fd);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
335
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
336 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
337
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
338 if (c->ssl) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
339 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
340 c->ssl->handler = ngx_stream_close_connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
341 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
342 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
343 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
344
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
345 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
346
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
347 #if (NGX_STAT_STUB)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
348 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
349 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
350
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
351 pool = c->pool;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
352
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
353 ngx_close_connection(c);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
354
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
355 ngx_destroy_pool(pool);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
356 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
357
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
358
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
359 static u_char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
360 ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
361 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
362 u_char *p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
363 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
364
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
365 if (log->action) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
366 p = ngx_snprintf(buf, len, " while %s", log->action);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
367 len -= p - buf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
368 buf = p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
369 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
370
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
371 s = log->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
372
6461
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
373 p = ngx_snprintf(buf, len, ", %sclient: %V, server: %V",
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
374 s->connection->type == SOCK_DGRAM ? "udp " : "",
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
375 &s->connection->addr_text,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
376 &s->connection->listening->addr_text);
6223
d1f94042c29c Stream: fixed potential error log buffer overrun.
Vladimir Homutov <vl@nginx.com>
parents: 6221
diff changeset
377 len -= p - buf;
d1f94042c29c Stream: fixed potential error log buffer overrun.
Vladimir Homutov <vl@nginx.com>
parents: 6221
diff changeset
378 buf = p;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
379
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
380 if (s->log_handler) {
6223
d1f94042c29c Stream: fixed potential error log buffer overrun.
Vladimir Homutov <vl@nginx.com>
parents: 6221
diff changeset
381 p = s->log_handler(log, buf, len);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
382 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
383
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
384 return p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
385 }