annotate src/stream/ngx_stream_core_module.c @ 8777:d5f93733c17d quic

QUIC: relaxed client id requirements. Client IDs cannot be reused on different paths. This change allows to reuse client id previosly seen on the same path (but with different dcid) in case when no unused client IDs are available.
author Vladimir Homutov <vl@nginx.com>
date Wed, 05 May 2021 18:11:55 +0300
parents 279ad36f2f4b
children d514f88053e5
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_stream.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
13 static ngx_int_t ngx_stream_core_preconfiguration(ngx_conf_t *cf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
14 static void *ngx_stream_core_create_main_conf(ngx_conf_t *cf);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
15 static char *ngx_stream_core_init_main_conf(ngx_conf_t *cf, void *conf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
16 static void *ngx_stream_core_create_srv_conf(ngx_conf_t *cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
17 static char *ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
18 void *child);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
19 static char *ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
20 void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21 static char *ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22 void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 static char *ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24 void *conf);
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
25 static char *ngx_stream_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
26 void *conf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
27
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
28
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
29 static ngx_command_t ngx_stream_core_commands[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
31 { ngx_string("variables_hash_max_size"),
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
32 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
33 ngx_conf_set_num_slot,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
34 NGX_STREAM_MAIN_CONF_OFFSET,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
35 offsetof(ngx_stream_core_main_conf_t, variables_hash_max_size),
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
36 NULL },
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
37
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
38 { ngx_string("variables_hash_bucket_size"),
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
39 NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
40 ngx_conf_set_num_slot,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
41 NGX_STREAM_MAIN_CONF_OFFSET,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
42 offsetof(ngx_stream_core_main_conf_t, variables_hash_bucket_size),
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
43 NULL },
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
44
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 { ngx_string("server"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 ngx_stream_core_server,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52 { ngx_string("listen"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 ngx_stream_core_listen,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57 NULL },
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 { ngx_string("error_log"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 ngx_stream_core_error_log,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
66 { ngx_string("resolver"),
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
67 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
68 ngx_stream_core_resolver,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
69 NGX_STREAM_SRV_CONF_OFFSET,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
70 0,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
71 NULL },
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
72
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
73 { ngx_string("resolver_timeout"),
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
74 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
75 ngx_conf_set_msec_slot,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
76 NGX_STREAM_SRV_CONF_OFFSET,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
77 offsetof(ngx_stream_core_srv_conf_t, resolver_timeout),
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
78 NULL },
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
79
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
80 { ngx_string("proxy_protocol_timeout"),
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
81 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
82 ngx_conf_set_msec_slot,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
83 NGX_STREAM_SRV_CONF_OFFSET,
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
84 offsetof(ngx_stream_core_srv_conf_t, proxy_protocol_timeout),
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
85 NULL },
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
86
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
87 { ngx_string("tcp_nodelay"),
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
88 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
89 ngx_conf_set_flag_slot,
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
90 NGX_STREAM_SRV_CONF_OFFSET,
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
91 offsetof(ngx_stream_core_srv_conf_t, tcp_nodelay),
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
92 NULL },
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
93
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
94 { ngx_string("preread_buffer_size"),
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
95 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
96 ngx_conf_set_size_slot,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
97 NGX_STREAM_SRV_CONF_OFFSET,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
98 offsetof(ngx_stream_core_srv_conf_t, preread_buffer_size),
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
99 NULL },
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
100
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
101 { ngx_string("preread_timeout"),
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
102 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
103 ngx_conf_set_msec_slot,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
104 NGX_STREAM_SRV_CONF_OFFSET,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
105 offsetof(ngx_stream_core_srv_conf_t, preread_timeout),
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
106 NULL },
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
107
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 ngx_null_command
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 };
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
112 static ngx_stream_module_t ngx_stream_core_module_ctx = {
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
113 ngx_stream_core_preconfiguration, /* preconfiguration */
6174
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6172
diff changeset
114 NULL, /* postconfiguration */
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6172
diff changeset
115
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116 ngx_stream_core_create_main_conf, /* create main configuration */
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
117 ngx_stream_core_init_main_conf, /* init main configuration */
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119 ngx_stream_core_create_srv_conf, /* create server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
120 ngx_stream_core_merge_srv_conf /* merge server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
121 };
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 ngx_module_t ngx_stream_core_module = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
125 NGX_MODULE_V1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
126 &ngx_stream_core_module_ctx, /* module context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127 ngx_stream_core_commands, /* module directives */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
128 NGX_STREAM_MODULE, /* module type */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
129 NULL, /* init master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
130 NULL, /* init module */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
131 NULL, /* init process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
132 NULL, /* init thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
133 NULL, /* exit thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
134 NULL, /* exit process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
135 NULL, /* exit master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
136 NGX_MODULE_V1_PADDING
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
137 };
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
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
140 void
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
141 ngx_stream_core_run_phases(ngx_stream_session_t *s)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
142 {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
143 ngx_int_t rc;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
144 ngx_stream_phase_handler_t *ph;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
145 ngx_stream_core_main_conf_t *cmcf;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
146
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
147 cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
148
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
149 ph = cmcf->phase_engine.handlers;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
150
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
151 while (ph[s->phase_handler].checker) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
152
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
153 rc = ph[s->phase_handler].checker(s, &ph[s->phase_handler]);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
154
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
155 if (rc == NGX_OK) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
156 return;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
157 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
158 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
159 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
160
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
161
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
162 ngx_int_t
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
163 ngx_stream_core_generic_phase(ngx_stream_session_t *s,
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
164 ngx_stream_phase_handler_t *ph)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
165 {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
166 ngx_int_t rc;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
167
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
168 /*
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
169 * generic phase checker,
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
170 * used by all phases, except for preread and content
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
171 */
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
172
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
173 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
174 "generic phase: %ui", s->phase_handler);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
175
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
176 rc = ph->handler(s);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
177
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
178 if (rc == NGX_OK) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
179 s->phase_handler = ph->next;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
180 return NGX_AGAIN;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
181 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
182
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
183 if (rc == NGX_DECLINED) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
184 s->phase_handler++;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
185 return NGX_AGAIN;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
186 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
187
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
188 if (rc == NGX_AGAIN || rc == NGX_DONE) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
189 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
190 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
191
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
192 if (rc == NGX_ERROR) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
193 rc = NGX_STREAM_INTERNAL_SERVER_ERROR;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
194 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
195
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
196 ngx_stream_finalize_session(s, rc);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
197
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
198 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
199 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
200
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
201
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
202 ngx_int_t
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
203 ngx_stream_core_preread_phase(ngx_stream_session_t *s,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
204 ngx_stream_phase_handler_t *ph)
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
205 {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
206 size_t size;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
207 ssize_t n;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
208 ngx_int_t rc;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
209 ngx_connection_t *c;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
210 ngx_stream_core_srv_conf_t *cscf;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
211
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
212 c = s->connection;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
213
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
214 c->log->action = "prereading client data";
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
215
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
216 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
217
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
218 if (c->read->timedout) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
219 rc = NGX_STREAM_OK;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
220
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
221 } else if (c->read->timer_set) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
222 rc = NGX_AGAIN;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
223
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
224 } else {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
225 rc = ph->handler(s);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
226 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
227
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
228 while (rc == NGX_AGAIN) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
229
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
230 if (c->buffer == NULL) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
231 c->buffer = ngx_create_temp_buf(c->pool, cscf->preread_buffer_size);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
232 if (c->buffer == NULL) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
233 rc = NGX_ERROR;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
234 break;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
235 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
236 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
237
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
238 size = c->buffer->end - c->buffer->last;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
239
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
240 if (size == 0) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
241 ngx_log_error(NGX_LOG_ERR, c->log, 0, "preread buffer full");
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
242 rc = NGX_STREAM_BAD_REQUEST;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
243 break;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
244 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
245
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
246 if (c->read->eof) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
247 rc = NGX_STREAM_OK;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
248 break;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
249 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
250
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
251 if (!c->read->ready) {
7345
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
252 break;
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
253 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
254
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
255 n = c->recv(c, c->buffer->last, size);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
256
7345
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
257 if (n == NGX_ERROR || n == 0) {
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
258 rc = NGX_STREAM_OK;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
259 break;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
260 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
261
7345
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
262 if (n == NGX_AGAIN) {
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
263 break;
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
264 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
265
7345
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
266 c->buffer->last += n;
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
267
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
268 rc = ph->handler(s);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
269 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
270
7345
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
271 if (rc == NGX_AGAIN) {
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
272 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
273 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
274 return NGX_OK;
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
275 }
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
276
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
277 if (!c->read->timer_set) {
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
278 ngx_add_timer(c->read, cscf->preread_timeout);
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
279 }
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
280
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
281 c->read->handler = ngx_stream_session_handler;
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
282
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
283 return NGX_OK;
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
284 }
fe767c99c2ad Stream: avoid potential infinite loop at preread phase.
Roman Arutyunyan <arut@nginx.com>
parents: 7269
diff changeset
285
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
286 if (c->read->timer_set) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
287 ngx_del_timer(c->read);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
288 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
289
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
290 if (rc == NGX_OK) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
291 s->phase_handler = ph->next;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
292 return NGX_AGAIN;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
293 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
294
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
295 if (rc == NGX_DECLINED) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
296 s->phase_handler++;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
297 return NGX_AGAIN;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
298 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
299
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
300 if (rc == NGX_DONE) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
301 return NGX_OK;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
302 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
303
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
304 if (rc == NGX_ERROR) {
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
305 rc = NGX_STREAM_INTERNAL_SERVER_ERROR;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
306 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
307
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
308 ngx_stream_finalize_session(s, rc);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
309
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
310 return NGX_OK;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
311 }
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
312
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
313
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
314 ngx_int_t
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
315 ngx_stream_core_content_phase(ngx_stream_session_t *s,
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
316 ngx_stream_phase_handler_t *ph)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
317 {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
318 ngx_connection_t *c;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
319 ngx_stream_core_srv_conf_t *cscf;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
320
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
321 c = s->connection;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
322
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
323 c->log->action = NULL;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
324
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
325 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
326
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
327 if (c->type == SOCK_STREAM
8482
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
328 #if (NGX_STREAM_QUIC)
8630
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8482
diff changeset
329 && c->quic == NULL
8482
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
330 #endif
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
331 && cscf->tcp_nodelay
7007
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6975
diff changeset
332 && ngx_tcp_nodelay(c) != NGX_OK)
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
333 {
7007
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6975
diff changeset
334 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6975
diff changeset
335 return NGX_OK;
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
336 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
337
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
338 cscf->handler(s);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
339
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
340 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
341 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
342
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
343
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
344 static ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
345 ngx_stream_core_preconfiguration(ngx_conf_t *cf)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
346 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
347 return ngx_stream_variables_add_core_vars(cf);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
348 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
349
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
350
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
351 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
352 ngx_stream_core_create_main_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
353 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
354 ngx_stream_core_main_conf_t *cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
355
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
356 cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_main_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
357 if (cmcf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
358 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
359 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
360
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
361 if (ngx_array_init(&cmcf->servers, cf->pool, 4,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
362 sizeof(ngx_stream_core_srv_conf_t *))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
363 != NGX_OK)
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 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
366 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
367
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
368 if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_stream_listen_t))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
369 != NGX_OK)
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 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
372 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
373
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
374 cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
375 cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
376
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
377 return cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
378 }
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
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
381 static char *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
382 ngx_stream_core_init_main_conf(ngx_conf_t *cf, void *conf)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
383 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
384 ngx_stream_core_main_conf_t *cmcf = conf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
385
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
386 ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
387 ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
388
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
389 cmcf->variables_hash_bucket_size =
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
390 ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
391
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
392 if (cmcf->ncaptures) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
393 cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
394 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
395
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
396 return NGX_CONF_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
397 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
398
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
399
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
400 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
401 ngx_stream_core_create_srv_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
402 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
403 ngx_stream_core_srv_conf_t *cscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
404
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
405 cscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_srv_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
406 if (cscf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
407 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
408 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
409
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
410 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
411 * set by ngx_pcalloc():
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
412 *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
413 * cscf->handler = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
414 * cscf->error_log = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
415 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
416
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
417 cscf->file_name = cf->conf_file->file.name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
418 cscf->line = cf->conf_file->line;
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
419 cscf->resolver_timeout = NGX_CONF_UNSET_MSEC;
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
420 cscf->proxy_protocol_timeout = NGX_CONF_UNSET_MSEC;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
421 cscf->tcp_nodelay = NGX_CONF_UNSET;
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
422 cscf->preread_buffer_size = NGX_CONF_UNSET_SIZE;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
423 cscf->preread_timeout = NGX_CONF_UNSET_MSEC;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
424
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
425 return cscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
426 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
427
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
428
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
429 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
430 ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
431 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
432 ngx_stream_core_srv_conf_t *prev = parent;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
433 ngx_stream_core_srv_conf_t *conf = child;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
434
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
435 ngx_conf_merge_msec_value(conf->resolver_timeout,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
436 prev->resolver_timeout, 30000);
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
437
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
438 if (conf->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
439
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
440 if (prev->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
441
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
442 /*
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
443 * create dummy resolver in stream {} context
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
444 * to inherit it in all servers
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
445 */
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
446
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
447 prev->resolver = ngx_resolver_create(cf, NULL, 0);
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
448 if (prev->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
449 return NGX_CONF_ERROR;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
450 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
451 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
452
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
453 conf->resolver = prev->resolver;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
454 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
455
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
456 if (conf->handler == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
457 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
458 "no handler for server in %s:%ui",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
459 conf->file_name, conf->line);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
460 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
461 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
462
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
463 if (conf->error_log == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
464 if (prev->error_log) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
465 conf->error_log = prev->error_log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
466 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
467 conf->error_log = &cf->cycle->new_log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
468 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
469 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
470
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
471 ngx_conf_merge_msec_value(conf->proxy_protocol_timeout,
6685
4a16fceea03b Stream: increase default value for proxy_protocol_timeout to 30s.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6680
diff changeset
472 prev->proxy_protocol_timeout, 30000);
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
473
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
474 ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
475
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
476 ngx_conf_merge_size_value(conf->preread_buffer_size,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
477 prev->preread_buffer_size, 16384);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
478
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
479 ngx_conf_merge_msec_value(conf->preread_timeout,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
480 prev->preread_timeout, 30000);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
481
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
482 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
483 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
484
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
485
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
486 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
487 ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
488 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
489 ngx_stream_core_srv_conf_t *cscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
490
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
491 return ngx_log_set_log(cf, &cscf->error_log);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
492 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
493
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
494
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
495 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
496 ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
497 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
498 char *rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
499 void *mconf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
500 ngx_uint_t m;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
501 ngx_conf_t pcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
502 ngx_stream_module_t *module;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
503 ngx_stream_conf_ctx_t *ctx, *stream_ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
504 ngx_stream_core_srv_conf_t *cscf, **cscfp;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
505 ngx_stream_core_main_conf_t *cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
506
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
507 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
508 if (ctx == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
509 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
510 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
511
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
512 stream_ctx = cf->ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
513 ctx->main_conf = stream_ctx->main_conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
514
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
515 /* the server{}'s srv_conf */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
516
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
517 ctx->srv_conf = ngx_pcalloc(cf->pool,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
518 sizeof(void *) * ngx_stream_max_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
519 if (ctx->srv_conf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
520 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
521 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
522
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
523 for (m = 0; cf->cycle->modules[m]; m++) {
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
524 if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
525 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
526 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
527
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
528 module = cf->cycle->modules[m]->ctx;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
529
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
530 if (module->create_srv_conf) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
531 mconf = module->create_srv_conf(cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
532 if (mconf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
533 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
534 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
535
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
536 ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
537 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
538 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
539
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
540 /* the server configuration context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
541
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
542 cscf = ctx->srv_conf[ngx_stream_core_module.ctx_index];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
543 cscf->ctx = ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
544
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
545 cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
546
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
547 cscfp = ngx_array_push(&cmcf->servers);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
548 if (cscfp == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
549 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
550 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
551
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
552 *cscfp = cscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
553
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
554
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
555 /* parse inside server{} */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
556
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
557 pcf = *cf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
558 cf->ctx = ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
559 cf->cmd_type = NGX_STREAM_SRV_CONF;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
560
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
561 rv = ngx_conf_parse(cf, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
562
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
563 *cf = pcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
564
6657
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
565 if (rv == NGX_CONF_OK && !cscf->listen) {
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
566 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
567 "no \"listen\" is defined for server in %s:%ui",
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
568 cscf->file_name, cscf->line);
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
569 return NGX_CONF_ERROR;
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
570 }
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
571
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
572 return rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
573 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
574
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
575
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
576 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
577 ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
578 {
6657
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
579 ngx_stream_core_srv_conf_t *cscf = conf;
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
580
6975
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
581 ngx_str_t *value, size;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
582 ngx_url_t u;
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
583 ngx_uint_t i, n, backlog;
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
584 ngx_stream_listen_t *ls, *als;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
585 ngx_stream_core_main_conf_t *cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
586
6657
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
587 cscf->listen = 1;
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
588
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
589 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
590
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
591 ngx_memzero(&u, sizeof(ngx_url_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
592
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
593 u.url = value[1];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
594 u.listen = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
595
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
596 if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
597 if (u.err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
598 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
599 "%s in \"%V\" of the \"listen\" directive",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
600 u.err, &u.url);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
601 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
602
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
603 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
604 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
605
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
606 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
607
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
608 ls = ngx_array_push_n(&cmcf->listen, u.naddrs);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
609 if (ls == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
610 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
611 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
612
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
613 ngx_memzero(ls, sizeof(ngx_stream_listen_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
614
6172
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
615 ls->backlog = NGX_LISTEN_BACKLOG;
6975
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
616 ls->rcvbuf = -1;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
617 ls->sndbuf = -1;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
618 ls->type = SOCK_STREAM;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
619 ls->ctx = cf->ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
620
6719
cebf5fed00bf Modules compatibility: removed unneeded IPV6_V6ONLY checks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6694
diff changeset
621 #if (NGX_HAVE_INET6)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
622 ls->ipv6only = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
623 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
624
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
625 backlog = 0;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
626
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
627 for (i = 2; i < cf->args->nelts; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
628
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
629 #if !(NGX_WIN32)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
630 if (ngx_strcmp(value[i].data, "udp") == 0) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
631 ls->type = SOCK_DGRAM;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
632 continue;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
633 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
634 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
635
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
636 if (ngx_strcmp(value[i].data, "bind") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
637 ls->bind = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
638 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
639 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
640
6172
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
641 if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
642 ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8);
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
643 ls->bind = 1;
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
644
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
645 if (ls->backlog == NGX_ERROR || ls->backlog == 0) {
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
646 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
647 "invalid backlog \"%V\"", &value[i]);
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
648 return NGX_CONF_ERROR;
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
649 }
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
650
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
651 backlog = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
652
6172
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
653 continue;
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
654 }
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
655
6975
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
656 if (ngx_strncmp(value[i].data, "rcvbuf=", 7) == 0) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
657 size.len = value[i].len - 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
658 size.data = value[i].data + 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
659
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
660 ls->rcvbuf = ngx_parse_size(&size);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
661 ls->bind = 1;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
662
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
663 if (ls->rcvbuf == NGX_ERROR) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
664 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
665 "invalid rcvbuf \"%V\"", &value[i]);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
666 return NGX_CONF_ERROR;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
667 }
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
668
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
669 continue;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
670 }
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
671
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
672 if (ngx_strncmp(value[i].data, "sndbuf=", 7) == 0) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
673 size.len = value[i].len - 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
674 size.data = value[i].data + 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
675
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
676 ls->sndbuf = ngx_parse_size(&size);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
677 ls->bind = 1;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
678
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
679 if (ls->sndbuf == NGX_ERROR) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
680 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
681 "invalid sndbuf \"%V\"", &value[i]);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
682 return NGX_CONF_ERROR;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
683 }
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
684
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
685 continue;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
686 }
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
687
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
688 if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
689 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
690 if (ngx_strcmp(&value[i].data[10], "n") == 0) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
691 ls->ipv6only = 1;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
692
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
693 } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
694 ls->ipv6only = 0;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
695
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
696 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
697 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
698 "invalid ipv6only flags \"%s\"",
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
699 &value[i].data[9]);
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
700 return NGX_CONF_ERROR;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
701 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
702
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
703 ls->bind = 1;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
704 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
705 #else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
706 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
707 "bind ipv6only is not supported "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
708 "on this platform");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
709 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
710 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
711 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
712
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
713 if (ngx_strcmp(value[i].data, "reuseport") == 0) {
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
714 #if (NGX_HAVE_REUSEPORT)
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
715 ls->reuseport = 1;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
716 ls->bind = 1;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
717 #else
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
718 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
719 "reuseport is not supported "
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
720 "on this platform, ignored");
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
721 #endif
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
722 continue;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
723 }
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
724
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
725 if (ngx_strcmp(value[i].data, "ssl") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
726 #if (NGX_STREAM_SSL)
7269
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
727 ngx_stream_ssl_conf_t *sslcf;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
728
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
729 sslcf = ngx_stream_conf_get_module_srv_conf(cf,
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
730 ngx_stream_ssl_module);
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
731
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
732 sslcf->listen = 1;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
733 sslcf->file = cf->conf_file->file.name.data;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
734 sslcf->line = cf->conf_file->line;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
735
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
736 ls->ssl = 1;
7269
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
737
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
738 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
739 #else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
740 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
741 "the \"ssl\" parameter requires "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
742 "ngx_stream_ssl_module");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
743 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
744 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
745 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
746
8482
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
747 if (ngx_strcmp(value[i].data, "quic") == 0) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
748 #if (NGX_STREAM_QUIC)
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
749 ngx_stream_ssl_conf_t *sslcf;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
750
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
751 sslcf = ngx_stream_conf_get_module_srv_conf(cf,
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
752 ngx_stream_ssl_module);
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
753
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
754 sslcf->listen = 1;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
755 sslcf->file = cf->conf_file->file.name.data;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
756 sslcf->line = cf->conf_file->line;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
757
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
758 ls->quic = 1;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
759 ls->type = SOCK_DGRAM;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
760
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
761 continue;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
762 #else
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
763 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
764 "the \"quic\" parameter requires "
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
765 "ngx_stream_quic_module");
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
766 return NGX_CONF_ERROR;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
767 #endif
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
768 }
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
769
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
770 if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
771
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
772 if (ngx_strcmp(&value[i].data[13], "on") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
773 ls->so_keepalive = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
774
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
775 } else if (ngx_strcmp(&value[i].data[13], "off") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
776 ls->so_keepalive = 2;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
777
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
778 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
779
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
780 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
781 u_char *p, *end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
782 ngx_str_t s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
783
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
784 end = value[i].data + value[i].len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
785 s.data = value[i].data + 13;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
786
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
787 p = ngx_strlchr(s.data, end, ':');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
788 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
789 p = end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
790 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
791
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
792 if (p > s.data) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
793 s.len = p - s.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
794
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
795 ls->tcp_keepidle = ngx_parse_time(&s, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
796 if (ls->tcp_keepidle == (time_t) NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
797 goto invalid_so_keepalive;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
798 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
799 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
800
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
801 s.data = (p < end) ? (p + 1) : end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
802
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
803 p = ngx_strlchr(s.data, end, ':');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
804 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
805 p = end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
806 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
807
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
808 if (p > s.data) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
809 s.len = p - s.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
810
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
811 ls->tcp_keepintvl = ngx_parse_time(&s, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
812 if (ls->tcp_keepintvl == (time_t) NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
813 goto invalid_so_keepalive;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
814 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
815 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
816
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
817 s.data = (p < end) ? (p + 1) : end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
818
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
819 if (s.data < end) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
820 s.len = end - s.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
821
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
822 ls->tcp_keepcnt = ngx_atoi(s.data, s.len);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
823 if (ls->tcp_keepcnt == NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
824 goto invalid_so_keepalive;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
825 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
826 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
827
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
828 if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
829 && ls->tcp_keepcnt == 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
830 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
831 goto invalid_so_keepalive;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
832 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
833
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
834 ls->so_keepalive = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
835
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
836 #else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
837
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
838 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
839 "the \"so_keepalive\" parameter accepts "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
840 "only \"on\" or \"off\" on this platform");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
841 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
842
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
843 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
844 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
845
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
846 ls->bind = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
847
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
848 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
849
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
850 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
851 invalid_so_keepalive:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
852
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
853 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
854 "invalid so_keepalive value: \"%s\"",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
855 &value[i].data[13]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
856 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
857 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
858 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
859
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
860 if (ngx_strcmp(value[i].data, "proxy_protocol") == 0) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
861 ls->proxy_protocol = 1;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
862 continue;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
863 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
864
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
865 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
866 "the invalid \"%V\" parameter", &value[i]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
867 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
868 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
869
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
870 if (ls->type == SOCK_DGRAM) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
871 if (backlog) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
872 return "\"backlog\" parameter is incompatible with \"udp\"";
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
873 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
874
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
875 #if (NGX_STREAM_SSL)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
876 if (ls->ssl) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
877 return "\"ssl\" parameter is incompatible with \"udp\"";
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
878 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
879 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
880
8482
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
881 #if (NGX_STREAM_SSL && NGX_STREAM_QUIC)
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
882 if (ls->ssl && ls->quic) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
883 return "\"ssl\" parameter is incompatible with \"quic\"";
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
884 }
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
885 #endif
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7478
diff changeset
886
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
887 if (ls->so_keepalive) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
888 return "\"so_keepalive\" parameter is incompatible with \"udp\"";
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
889 }
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
890
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
891 if (ls->proxy_protocol) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
892 return "\"proxy_protocol\" parameter is incompatible with \"udp\"";
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
893 }
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
894 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
895
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
896 als = cmcf->listen.elts;
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
897
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
898 for (n = 0; n < u.naddrs; n++) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
899 ls[n] = ls[0];
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
900
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
901 ls[n].sockaddr = u.addrs[n].sockaddr;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
902 ls[n].socklen = u.addrs[n].socklen;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
903 ls[n].addr_text = u.addrs[n].name;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
904 ls[n].wildcard = ngx_inet_wildcard(ls[n].sockaddr);
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
905
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
906 for (i = 0; i < cmcf->listen.nelts - u.naddrs + n; i++) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
907 if (ls[n].type != als[i].type) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
908 continue;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
909 }
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
910
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
911 if (ngx_cmp_sockaddr(als[i].sockaddr, als[i].socklen,
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
912 ls[n].sockaddr, ls[n].socklen, 1)
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
913 != NGX_OK)
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
914 {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
915 continue;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
916 }
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
917
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
918 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
919 "duplicate \"%V\" address and port pair",
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
920 &ls[n].addr_text);
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
921 return NGX_CONF_ERROR;
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
922 }
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
923 }
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
924
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
925 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
926 }
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
927
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
928
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
929 static char *
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
930 ngx_stream_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
931 {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
932 ngx_stream_core_srv_conf_t *cscf = conf;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
933
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
934 ngx_str_t *value;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
935
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
936 if (cscf->resolver) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
937 return "is duplicate";
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
938 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
939
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
940 value = cf->args->elts;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
941
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
942 cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
943 if (cscf->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
944 return NGX_CONF_ERROR;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
945 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
946
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
947 return NGX_CONF_OK;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
948 }