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

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents 4f9b72a229c1
children 2ab7b55ae4a0 893b3313f53c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_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
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
328 && cscf->tcp_nodelay
7007
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6975
diff changeset
329 && ngx_tcp_nodelay(c) != NGX_OK)
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
330 {
7007
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6975
diff changeset
331 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
ed1101bbf19f Introduced ngx_tcp_nodelay().
Ruslan Ermilov <ru@nginx.com>
parents: 6975
diff changeset
332 return NGX_OK;
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
333 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
334
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
335 cscf->handler(s);
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 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6685
diff changeset
338 }
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
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
341 static ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
342 ngx_stream_core_preconfiguration(ngx_conf_t *cf)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
343 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
344 return ngx_stream_variables_add_core_vars(cf);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
345 }
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
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
348 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
349 ngx_stream_core_create_main_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
350 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
351 ngx_stream_core_main_conf_t *cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
352
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
353 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
354 if (cmcf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
355 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
356 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
357
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
358 if (ngx_array_init(&cmcf->servers, cf->pool, 4,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
359 sizeof(ngx_stream_core_srv_conf_t *))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
360 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
361 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
362 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
363 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
364
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
365 if (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
366 != NGX_OK)
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 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
369 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
370
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
371 cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
372 cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
373
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
374 return cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
375 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
376
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
377
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
378 static char *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
379 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
380 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
381 ngx_stream_core_main_conf_t *cmcf = conf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
382
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
383 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
384 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
385
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
386 cmcf->variables_hash_bucket_size =
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
387 ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);
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 if (cmcf->ncaptures) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
390 cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
393 return NGX_CONF_OK;
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
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
397 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
398 ngx_stream_core_create_srv_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
399 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
400 ngx_stream_core_srv_conf_t *cscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
401
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
402 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
403 if (cscf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
404 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
405 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
406
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
407 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
408 * set by ngx_pcalloc():
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 * cscf->handler = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
411 * cscf->error_log = NULL;
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
414 cscf->file_name = cf->conf_file->file.name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
415 cscf->line = cf->conf_file->line;
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
416 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
417 cscf->proxy_protocol_timeout = NGX_CONF_UNSET_MSEC;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
418 cscf->tcp_nodelay = NGX_CONF_UNSET;
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
419 cscf->preread_buffer_size = NGX_CONF_UNSET_SIZE;
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
420 cscf->preread_timeout = NGX_CONF_UNSET_MSEC;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
421
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
422 return cscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
423 }
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
426 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
427 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
428 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
429 ngx_stream_core_srv_conf_t *prev = parent;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
430 ngx_stream_core_srv_conf_t *conf = child;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
431
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
432 ngx_conf_merge_msec_value(conf->resolver_timeout,
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
433 prev->resolver_timeout, 30000);
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
434
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
435 if (conf->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
436
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
437 if (prev->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
438
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 * create dummy resolver in stream {} context
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
441 * to inherit it in all servers
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
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
444 prev->resolver = ngx_resolver_create(cf, NULL, 0);
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
445 if (prev->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
446 return NGX_CONF_ERROR;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
447 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
448 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
449
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
450 conf->resolver = prev->resolver;
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
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
453 if (conf->handler == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
454 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
455 "no handler for server in %s:%ui",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
456 conf->file_name, conf->line);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
457 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
458 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
459
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
460 if (conf->error_log == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
461 if (prev->error_log) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
462 conf->error_log = prev->error_log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
463 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
464 conf->error_log = &cf->cycle->new_log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
465 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
466 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
467
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
468 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
469 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
470
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
471 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
472
6694
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
473 ngx_conf_merge_size_value(conf->preread_buffer_size,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
474 prev->preread_buffer_size, 16384);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
475
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
476 ngx_conf_merge_msec_value(conf->preread_timeout,
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
477 prev->preread_timeout, 30000);
ea9dfe2f62e7 Stream: preread phase.
Vladimir Homutov <vl@nginx.com>
parents: 6693
diff changeset
478
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
479 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
480 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
481
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
482
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
483 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
484 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
485 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
486 ngx_stream_core_srv_conf_t *cscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
487
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
488 return ngx_log_set_log(cf, &cscf->error_log);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
489 }
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
492 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
493 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
494 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
495 char *rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
496 void *mconf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
497 ngx_uint_t m;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
498 ngx_conf_t pcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
499 ngx_stream_module_t *module;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
500 ngx_stream_conf_ctx_t *ctx, *stream_ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
501 ngx_stream_core_srv_conf_t *cscf, **cscfp;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
502 ngx_stream_core_main_conf_t *cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
503
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
504 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
505 if (ctx == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
506 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
507 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
508
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
509 stream_ctx = cf->ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
510 ctx->main_conf = stream_ctx->main_conf;
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 /* the server{}'s srv_conf */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
513
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
514 ctx->srv_conf = ngx_pcalloc(cf->pool,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
515 sizeof(void *) * ngx_stream_max_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
516 if (ctx->srv_conf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
517 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
518 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
519
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
520 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
521 if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
522 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
523 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
524
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
525 module = cf->cycle->modules[m]->ctx;
6115
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 if (module->create_srv_conf) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
528 mconf = module->create_srv_conf(cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
529 if (mconf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
530 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
531 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
532
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6230
diff changeset
533 ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;
6115
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 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
536
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
537 /* the server configuration context */
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 cscf = ctx->srv_conf[ngx_stream_core_module.ctx_index];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
540 cscf->ctx = ctx;
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 cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
543
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
544 cscfp = ngx_array_push(&cmcf->servers);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
545 if (cscfp == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
546 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
547 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
548
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
549 *cscfp = cscf;
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 /* parse inside server{} */
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 pcf = *cf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
555 cf->ctx = ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
556 cf->cmd_type = NGX_STREAM_SRV_CONF;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
557
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
558 rv = ngx_conf_parse(cf, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
559
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
560 *cf = pcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
561
6657
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
562 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
563 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
564 "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
565 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
566 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
567 }
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
568
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
569 return rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
570 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
571
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
572
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
573 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
574 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
575 {
6657
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
576 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
577
6975
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
578 ngx_str_t *value, size;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
579 ngx_url_t u;
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
580 ngx_uint_t i, n, backlog;
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
581 ngx_stream_listen_t *ls, *als;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
582 ngx_stream_core_main_conf_t *cmcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
583
6657
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
584 cscf->listen = 1;
3d5202c71f94 Ensure "listen" exists in a mail or stream server (ticket #1049).
Roman Arutyunyan <arut@nginx.com>
parents: 6618
diff changeset
585
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
586 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
587
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
588 ngx_memzero(&u, sizeof(ngx_url_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
589
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
590 u.url = value[1];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
591 u.listen = 1;
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 if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
594 if (u.err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
595 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
596 "%s in \"%V\" of the \"listen\" directive",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
597 u.err, &u.url);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
598 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
599
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
600 return NGX_CONF_ERROR;
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 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
604
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
605 ls = ngx_array_push_n(&cmcf->listen, u.naddrs);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
606 if (ls == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
607 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
608 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
609
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
610 ngx_memzero(ls, sizeof(ngx_stream_listen_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
611
6172
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
612 ls->backlog = NGX_LISTEN_BACKLOG;
6975
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
613 ls->rcvbuf = -1;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
614 ls->sndbuf = -1;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
615 ls->type = SOCK_STREAM;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
616 ls->ctx = cf->ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
617
6719
cebf5fed00bf Modules compatibility: removed unneeded IPV6_V6ONLY checks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6694
diff changeset
618 #if (NGX_HAVE_INET6)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
619 ls->ipv6only = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
620 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
621
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
622 backlog = 0;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
623
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
624 for (i = 2; i < cf->args->nelts; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
625
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
626 #if !(NGX_WIN32)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
627 if (ngx_strcmp(value[i].data, "udp") == 0) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
628 ls->type = SOCK_DGRAM;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
629 continue;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
630 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
631 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
632
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
633 if (ngx_strcmp(value[i].data, "bind") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
634 ls->bind = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
635 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
636 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
637
6172
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
638 if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) {
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
639 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
640 ls->bind = 1;
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
641
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
642 if (ls->backlog == NGX_ERROR || ls->backlog == 0) {
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
643 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
644 "invalid backlog \"%V\"", &value[i]);
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
645 return NGX_CONF_ERROR;
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
646 }
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
647
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
648 backlog = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
649
6172
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
650 continue;
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
651 }
3e8cddcff381 Stream: listen backlog=.
Ruslan Ermilov <ru@nginx.com>
parents: 6170
diff changeset
652
6975
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
653 if (ngx_strncmp(value[i].data, "rcvbuf=", 7) == 0) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
654 size.len = value[i].len - 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
655 size.data = value[i].data + 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
656
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
657 ls->rcvbuf = ngx_parse_size(&size);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
658 ls->bind = 1;
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 if (ls->rcvbuf == NGX_ERROR) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
661 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
662 "invalid rcvbuf \"%V\"", &value[i]);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
663 return NGX_CONF_ERROR;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
664 }
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
665
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
666 continue;
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 if (ngx_strncmp(value[i].data, "sndbuf=", 7) == 0) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
670 size.len = value[i].len - 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
671 size.data = value[i].data + 7;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
672
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
673 ls->sndbuf = ngx_parse_size(&size);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
674 ls->bind = 1;
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 if (ls->sndbuf == NGX_ERROR) {
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
677 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
678 "invalid sndbuf \"%V\"", &value[i]);
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
679 return NGX_CONF_ERROR;
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
680 }
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
681
d7ce41bdf050 Stream: configurable socket buffer sizes.
Vladimir Homutov <vl@nginx.com>
parents: 6719
diff changeset
682 continue;
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
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
685 if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
686 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
687 if (ngx_strcmp(&value[i].data[10], "n") == 0) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
688 ls->ipv6only = 1;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
689
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
690 } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
691 ls->ipv6only = 0;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
692
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
693 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
694 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
695 "invalid ipv6only flags \"%s\"",
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
696 &value[i].data[9]);
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
697 return NGX_CONF_ERROR;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
698 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
699
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
700 ls->bind = 1;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
701 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
702 #else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
703 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
704 "bind ipv6only is not supported "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
705 "on this platform");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
706 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
707 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
708 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
709
6153
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
710 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
711 #if (NGX_HAVE_REUSEPORT)
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
712 ls->reuseport = 1;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
713 ls->bind = 1;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
714 #else
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
715 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
716 "reuseport is not supported "
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
717 "on this platform, ignored");
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
718 #endif
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
719 continue;
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
720 }
4f6efabcb09b The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
721
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
722 if (ngx_strcmp(value[i].data, "ssl") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
723 #if (NGX_STREAM_SSL)
7269
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
724 ngx_stream_ssl_conf_t *sslcf;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
725
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
726 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
727 ngx_stream_ssl_module);
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->listen = 1;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
730 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
731 sslcf->line = cf->conf_file->line;
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
732
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
733 ls->ssl = 1;
7269
7f955d3b9a0d SSL: detect "listen ... ssl" without certificates (ticket #178).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7007
diff changeset
734
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
735 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
736 #else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
737 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
738 "the \"ssl\" parameter requires "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
739 "ngx_stream_ssl_module");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
740 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
741 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
742 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
743
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
744 if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {
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 if (ngx_strcmp(&value[i].data[13], "on") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
747 ls->so_keepalive = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
748
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
749 } else if (ngx_strcmp(&value[i].data[13], "off") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
750 ls->so_keepalive = 2;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
751
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
752 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
753
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
754 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
755 u_char *p, *end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
756 ngx_str_t s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
757
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
758 end = value[i].data + value[i].len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
759 s.data = value[i].data + 13;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
760
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
761 p = ngx_strlchr(s.data, end, ':');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
762 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
763 p = end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
764 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
765
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
766 if (p > s.data) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
767 s.len = p - s.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
768
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
769 ls->tcp_keepidle = ngx_parse_time(&s, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
770 if (ls->tcp_keepidle == (time_t) NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
771 goto invalid_so_keepalive;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
772 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
773 }
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 s.data = (p < end) ? (p + 1) : end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
776
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
777 p = ngx_strlchr(s.data, end, ':');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
778 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
779 p = end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
780 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
781
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
782 if (p > s.data) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
783 s.len = p - s.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
784
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
785 ls->tcp_keepintvl = ngx_parse_time(&s, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
786 if (ls->tcp_keepintvl == (time_t) NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
787 goto invalid_so_keepalive;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
788 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
789 }
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 s.data = (p < end) ? (p + 1) : end;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
792
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
793 if (s.data < end) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
794 s.len = end - s.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
795
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
796 ls->tcp_keepcnt = ngx_atoi(s.data, s.len);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
797 if (ls->tcp_keepcnt == NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
798 goto invalid_so_keepalive;
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
802 if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
803 && ls->tcp_keepcnt == 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
804 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
805 goto invalid_so_keepalive;
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 ls->so_keepalive = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
809
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
810 #else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
811
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
812 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
813 "the \"so_keepalive\" parameter accepts "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
814 "only \"on\" or \"off\" on this platform");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
815 return NGX_CONF_ERROR;
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 #endif
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
820 ls->bind = 1;
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 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
823
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
824 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
825 invalid_so_keepalive:
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 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
828 "invalid so_keepalive value: \"%s\"",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
829 &value[i].data[13]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
830 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
831 #endif
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
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
834 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
835 ls->proxy_protocol = 1;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
836 continue;
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
837 }
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
838
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
839 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
840 "the invalid \"%V\" parameter", &value[i]);
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
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
844 if (ls->type == SOCK_DGRAM) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
845 if (backlog) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
846 return "\"backlog\" parameter is incompatible with \"udp\"";
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
847 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
848
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
849 #if (NGX_STREAM_SSL)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
850 if (ls->ssl) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
851 return "\"ssl\" parameter is incompatible with \"udp\"";
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
852 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
853 #endif
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
854
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
855 if (ls->so_keepalive) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
856 return "\"so_keepalive\" parameter is incompatible with \"udp\"";
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
857 }
6680
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
858
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
859 if (ls->proxy_protocol) {
7357abd1fa8c Stream: the "proxy_protocol" parameter of the "listen" directive.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6657
diff changeset
860 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
861 }
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
862 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
863
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
864 als = cmcf->listen.elts;
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
865
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
866 for (n = 0; n < u.naddrs; n++) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
867 ls[n] = ls[0];
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
868
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
869 ls[n].sockaddr = u.addrs[n].sockaddr;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
870 ls[n].socklen = u.addrs[n].socklen;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
871 ls[n].addr_text = u.addrs[n].name;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
872 ls[n].wildcard = ngx_inet_wildcard(ls[n].sockaddr);
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
873
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
874 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
875 if (ls[n].type != als[i].type) {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
876 continue;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
877 }
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
878
7478
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
879 if (ngx_cmp_sockaddr(als[i].sockaddr, als[i].socklen,
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
880 ls[n].sockaddr, ls[n].socklen, 1)
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
881 != NGX_OK)
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
882 {
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
883 continue;
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
884 }
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
885
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
886 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
887 "duplicate \"%V\" address and port pair",
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
888 &ls[n].addr_text);
4f9b72a229c1 Multiple addresses in "listen".
Roman Arutyunyan <arut@nginx.com>
parents: 7345
diff changeset
889 return NGX_CONF_ERROR;
6558
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
890 }
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
891 }
68854ce64ec7 Stream: fixed duplicate listen address detection.
Ruslan Ermilov <ru@nginx.com>
parents: 6557
diff changeset
892
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
893 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
894 }
6618
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
895
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
896
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
897 static char *
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
898 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
899 {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
900 ngx_stream_core_srv_conf_t *cscf = conf;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
901
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
902 ngx_str_t *value;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
903
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
904 if (cscf->resolver) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
905 return "is duplicate";
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
906 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
907
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
908 value = cf->args->elts;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
909
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
910 cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
911 if (cscf->resolver == NULL) {
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
912 return NGX_CONF_ERROR;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
913 }
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
914
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
915 return NGX_CONF_OK;
070c31a482e6 Stream: resolver.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
916 }