annotate src/stream/ngx_stream_proxy_module.c @ 6719:cebf5fed00bf

Modules compatibility: removed unneeded IPV6_V6ONLY checks. The IPV6_V6ONLY macro is now checked only while parsing appropriate flag and when using the macro. The ipv6only field in listen structures is always initialized to 1, even if not supported on a given platform. This is expected to prevent a module compiled without IPV6_V6ONLY from accidentally creating dual sockets if loaded into main binary with proper IPV6_V6ONLY support.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 03 Oct 2016 15:58:25 +0300
parents edcd9303a4d3
children 563a1ee345a4
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13 typedef struct {
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
14 ngx_addr_t *addr;
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
15 ngx_stream_complex_value_t *value;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
16 #if (NGX_HAVE_TRANSPARENT_PROXY)
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
17 ngx_uint_t transparent; /* unsigned transparent:1; */
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
18 #endif
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
19 } ngx_stream_upstream_local_t;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
20
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
21
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
22 typedef struct {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 ngx_msec_t connect_timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24 ngx_msec_t timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 ngx_msec_t next_upstream_timeout;
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
26 size_t buffer_size;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
27 size_t upload_rate;
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
28 size_t download_rate;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
29 ngx_uint_t responses;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30 ngx_uint_t next_upstream_tries;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31 ngx_flag_t next_upstream;
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
32 ngx_flag_t proxy_protocol;
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
33 ngx_stream_upstream_local_t *local;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 ngx_flag_t ssl_enable;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37 ngx_flag_t ssl_session_reuse;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38 ngx_uint_t ssl_protocols;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
39 ngx_str_t ssl_ciphers;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
40 ngx_stream_complex_value_t *ssl_name;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 ngx_flag_t ssl_server_name;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 ngx_flag_t ssl_verify;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44 ngx_uint_t ssl_verify_depth;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 ngx_str_t ssl_trusted_certificate;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 ngx_str_t ssl_crl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 ngx_str_t ssl_certificate;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48 ngx_str_t ssl_certificate_key;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 ngx_array_t *ssl_passwords;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 ngx_ssl_t *ssl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 ngx_stream_upstream_srv_conf_t *upstream;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
55 ngx_stream_complex_value_t *upstream_value;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 } ngx_stream_proxy_srv_conf_t;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57
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 static void ngx_stream_proxy_handler(ngx_stream_session_t *s);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
60 static ngx_int_t ngx_stream_proxy_eval(ngx_stream_session_t *s,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
61 ngx_stream_proxy_srv_conf_t *pscf);
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
62 static ngx_int_t ngx_stream_proxy_set_local(ngx_stream_session_t *s,
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
63 ngx_stream_upstream_t *u, ngx_stream_upstream_local_t *local);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 static void ngx_stream_proxy_connect(ngx_stream_session_t *s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 static void ngx_stream_proxy_init_upstream(ngx_stream_session_t *s);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
66 static void ngx_stream_proxy_resolve_handler(ngx_resolver_ctx_t *ctx);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 static void ngx_stream_proxy_upstream_handler(ngx_event_t *ev);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
68 static void ngx_stream_proxy_downstream_handler(ngx_event_t *ev);
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
69 static void ngx_stream_proxy_process_connection(ngx_event_t *ev,
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
70 ngx_uint_t from_upstream);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
71 static void ngx_stream_proxy_connect_handler(ngx_event_t *ev);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72 static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
73 static void ngx_stream_proxy_process(ngx_stream_session_t *s,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74 ngx_uint_t from_upstream, ngx_uint_t do_write);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75 static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
76 static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77 static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 size_t len);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
80 static void *ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 static char *ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82 void *child);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83 static char *ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
84 void *conf);
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
85 static char *ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
86 void *conf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
87
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
88 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
89
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
90 static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
91 static char *ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
92 ngx_command_t *cmd, void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
93 static void ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
94 static void ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
95 static ngx_int_t ngx_stream_proxy_ssl_name(ngx_stream_session_t *s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
96 static ngx_int_t ngx_stream_proxy_set_ssl(ngx_conf_t *cf,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
97 ngx_stream_proxy_srv_conf_t *pscf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
98
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
99
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100 static ngx_conf_bitmask_t ngx_stream_proxy_ssl_protocols[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 { ngx_null_string, 0 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
110
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
111
6217
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
112 static ngx_conf_deprecated_t ngx_conf_deprecated_proxy_downstream_buffer = {
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
113 ngx_conf_deprecated, "proxy_downstream_buffer", "proxy_buffer_size"
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
114 };
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
115
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
116 static ngx_conf_deprecated_t ngx_conf_deprecated_proxy_upstream_buffer = {
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
117 ngx_conf_deprecated, "proxy_upstream_buffer", "proxy_buffer_size"
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
118 };
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
119
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
120
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
121 static ngx_command_t ngx_stream_proxy_commands[] = {
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 { ngx_string("proxy_pass"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
124 NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
125 ngx_stream_proxy_pass,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
126 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
128 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
129
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
130 { ngx_string("proxy_bind"),
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
131 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12,
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
132 ngx_stream_proxy_bind,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
133 NGX_STREAM_SRV_CONF_OFFSET,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
134 0,
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
135 NULL },
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
136
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
137 { ngx_string("proxy_connect_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
138 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
139 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
140 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
141 offsetof(ngx_stream_proxy_srv_conf_t, connect_timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
142 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
143
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
144 { ngx_string("proxy_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
145 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
146 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
147 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
148 offsetof(ngx_stream_proxy_srv_conf_t, timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
151 { ngx_string("proxy_buffer_size"),
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 ngx_conf_set_size_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154 NGX_STREAM_SRV_CONF_OFFSET,
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
155 offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157
6217
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
158 { ngx_string("proxy_downstream_buffer"),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
159 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
160 ngx_conf_set_size_slot,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
161 NGX_STREAM_SRV_CONF_OFFSET,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
162 offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
163 &ngx_conf_deprecated_proxy_downstream_buffer },
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
164
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
165 { ngx_string("proxy_upstream_buffer"),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
166 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
167 ngx_conf_set_size_slot,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
168 NGX_STREAM_SRV_CONF_OFFSET,
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
169 offsetof(ngx_stream_proxy_srv_conf_t, buffer_size),
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
170 &ngx_conf_deprecated_proxy_upstream_buffer },
b544f8e0d921 Stream: deprecated proxy_downstream_buffer, proxy_upstream_buffer.
Roman Arutyunyan <arut@nginx.com>
parents: 6216
diff changeset
171
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
172 { ngx_string("proxy_upload_rate"),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
173 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
174 ngx_conf_set_size_slot,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
175 NGX_STREAM_SRV_CONF_OFFSET,
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
176 offsetof(ngx_stream_proxy_srv_conf_t, upload_rate),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
177 NULL },
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
178
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
179 { ngx_string("proxy_download_rate"),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
180 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
181 ngx_conf_set_size_slot,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
182 NGX_STREAM_SRV_CONF_OFFSET,
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
183 offsetof(ngx_stream_proxy_srv_conf_t, download_rate),
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
184 NULL },
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
185
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
186 { ngx_string("proxy_responses"),
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
187 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
188 ngx_conf_set_num_slot,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
189 NGX_STREAM_SRV_CONF_OFFSET,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
190 offsetof(ngx_stream_proxy_srv_conf_t, responses),
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
191 NULL },
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
192
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
193 { ngx_string("proxy_next_upstream"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
194 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
195 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
196 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
197 offsetof(ngx_stream_proxy_srv_conf_t, next_upstream),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
198 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
199
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
200 { ngx_string("proxy_next_upstream_tries"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
201 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
202 ngx_conf_set_num_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
203 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
204 offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_tries),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
205 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
206
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
207 { ngx_string("proxy_next_upstream_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
208 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
209 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
210 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
211 offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
212 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
213
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
214 { ngx_string("proxy_protocol"),
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
215 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
216 ngx_conf_set_flag_slot,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
217 NGX_STREAM_SRV_CONF_OFFSET,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
218 offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol),
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
219 NULL },
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
220
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
222
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
223 { ngx_string("proxy_ssl"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
224 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
225 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
226 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
227 offsetof(ngx_stream_proxy_srv_conf_t, ssl_enable),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
228 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
229
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
230 { ngx_string("proxy_ssl_session_reuse"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
231 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
232 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
233 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
234 offsetof(ngx_stream_proxy_srv_conf_t, ssl_session_reuse),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
235 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
236
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
237 { ngx_string("proxy_ssl_protocols"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
238 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
239 ngx_conf_set_bitmask_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
240 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
241 offsetof(ngx_stream_proxy_srv_conf_t, ssl_protocols),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
242 &ngx_stream_proxy_ssl_protocols },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
243
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
244 { ngx_string("proxy_ssl_ciphers"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
245 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
246 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
247 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
248 offsetof(ngx_stream_proxy_srv_conf_t, ssl_ciphers),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
249 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
250
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
251 { ngx_string("proxy_ssl_name"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
252 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
253 ngx_stream_set_complex_value_slot,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
254 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
255 offsetof(ngx_stream_proxy_srv_conf_t, ssl_name),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
256 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
257
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
258 { ngx_string("proxy_ssl_server_name"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
259 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
260 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
261 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
262 offsetof(ngx_stream_proxy_srv_conf_t, ssl_server_name),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
263 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
264
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
265 { ngx_string("proxy_ssl_verify"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
266 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
267 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
268 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
269 offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
270 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
271
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
272 { ngx_string("proxy_ssl_verify_depth"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
273 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
274 ngx_conf_set_num_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
275 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
276 offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify_depth),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
277 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
278
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
279 { ngx_string("proxy_ssl_trusted_certificate"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
280 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
281 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
282 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
283 offsetof(ngx_stream_proxy_srv_conf_t, ssl_trusted_certificate),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
284 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
285
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
286 { ngx_string("proxy_ssl_crl"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
287 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
288 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
289 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
290 offsetof(ngx_stream_proxy_srv_conf_t, ssl_crl),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
291 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
292
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
293 { ngx_string("proxy_ssl_certificate"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
294 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
295 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
296 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
297 offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
298 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
299
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
300 { ngx_string("proxy_ssl_certificate_key"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
301 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
302 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
303 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
304 offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate_key),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
305 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
306
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
307 { ngx_string("proxy_ssl_password_file"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
308 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
309 ngx_stream_proxy_ssl_password_file,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
310 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
311 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
312 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
313
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
314 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
315
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
316 ngx_null_command
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
317 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
318
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
319
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
320 static ngx_stream_module_t ngx_stream_proxy_module_ctx = {
6606
2f41d383c9c7 Stream: added preconfiguration step.
Vladimir Homutov <vl@nginx.com>
parents: 6599
diff changeset
321 NULL, /* preconfiguration */
6174
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6157
diff changeset
322 NULL, /* postconfiguration */
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6157
diff changeset
323
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
324 NULL, /* create main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
325 NULL, /* init main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
326
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
327 ngx_stream_proxy_create_srv_conf, /* create server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
328 ngx_stream_proxy_merge_srv_conf /* merge server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
329 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
330
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
331
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
332 ngx_module_t ngx_stream_proxy_module = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
333 NGX_MODULE_V1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
334 &ngx_stream_proxy_module_ctx, /* module context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
335 ngx_stream_proxy_commands, /* module directives */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
336 NGX_STREAM_MODULE, /* module type */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
337 NULL, /* init master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
338 NULL, /* init module */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
339 NULL, /* init process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
340 NULL, /* init thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
341 NULL, /* exit thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
342 NULL, /* exit process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
343 NULL, /* exit master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
344 NGX_MODULE_V1_PADDING
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
345 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
346
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
347
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_proxy_handler(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
350 {
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
351 u_char *p;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
352 ngx_str_t *host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
353 ngx_uint_t i;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
354 ngx_connection_t *c;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
355 ngx_resolver_ctx_t *ctx, temp;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
356 ngx_stream_upstream_t *u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
357 ngx_stream_core_srv_conf_t *cscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
358 ngx_stream_proxy_srv_conf_t *pscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
359 ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
360 ngx_stream_upstream_main_conf_t *umcf;
6115
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 c = s->connection;
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 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
365
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
366 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
367 "proxy connection handler");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
368
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
369 u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
370 if (u == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
371 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
372 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
373 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
374
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
375 s->upstream = u;
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 s->log_handler = ngx_stream_proxy_log_error;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
378
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
379 u->peer.log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
380 u->peer.log_error = NGX_ERROR_ERR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
381
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
382 if (ngx_stream_proxy_set_local(s, u, pscf->local) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
383 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
384 return;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
385 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
386
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
387 u->peer.type = c->type;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
388 u->start_sec = ngx_time();
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
389
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
390 c->write->handler = ngx_stream_proxy_downstream_handler;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
391 c->read->handler = ngx_stream_proxy_downstream_handler;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
392
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
393 s->upstream_states = ngx_array_create(c->pool, 1,
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
394 sizeof(ngx_stream_upstream_state_t));
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
395 if (s->upstream_states == NULL) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
396 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
397 return;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
398 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
399
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
400 if (c->type == SOCK_STREAM) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
401 p = ngx_pnalloc(c->pool, pscf->buffer_size);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
402 if (p == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
403 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
404 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
405 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
406
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
407 u->downstream_buf.start = p;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
408 u->downstream_buf.end = p + pscf->buffer_size;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
409 u->downstream_buf.pos = p;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
410 u->downstream_buf.last = p;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
411
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
412 if (c->read->ready) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
413 ngx_post_event(c->read, &ngx_posted_events);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
414 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
415 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
416
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
417 if (pscf->upstream_value) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
418 if (ngx_stream_proxy_eval(s, pscf) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
419 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
420 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
421 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
422 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
423
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
424 if (u->resolved == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
425
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
426 uscf = pscf->upstream;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
427
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
428 } else {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
429
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
430 #if (NGX_STREAM_SSL)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
431 u->ssl_name = u->resolved->host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
432 #endif
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
433
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
434 host = &u->resolved->host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
435
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
436 if (u->resolved->sockaddr) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
437
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
438 if (u->resolved->port == 0
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
439 && u->resolved->sockaddr->sa_family != AF_UNIX)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
440 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
441 ngx_log_error(NGX_LOG_ERR, c->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
442 "no port in upstream \"%V\"", host);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
443 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
444 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
445 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
446
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
447 if (ngx_stream_upstream_create_round_robin_peer(s, u->resolved)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
448 != NGX_OK)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
449 {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
450 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
451 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
452 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
453
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
454 ngx_stream_proxy_connect(s);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
455
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
456 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
457 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
458
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
459 umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
460
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
461 uscfp = umcf->upstreams.elts;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
462
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
463 for (i = 0; i < umcf->upstreams.nelts; i++) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
464
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
465 uscf = uscfp[i];
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
466
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
467 if (uscf->host.len == host->len
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
468 && ((uscf->port == 0 && u->resolved->no_port)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
469 || uscf->port == u->resolved->port)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
470 && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
471 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
472 goto found;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
473 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
474 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
475
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
476 if (u->resolved->port == 0) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
477 ngx_log_error(NGX_LOG_ERR, c->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
478 "no port in upstream \"%V\"", host);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
479 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
480 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
481 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
482
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
483 temp.name = *host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
484
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
485 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
486
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
487 ctx = ngx_resolve_start(cscf->resolver, &temp);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
488 if (ctx == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
489 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
490 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
491 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
492
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
493 if (ctx == NGX_NO_RESOLVER) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
494 ngx_log_error(NGX_LOG_ERR, c->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
495 "no resolver defined to resolve %V", host);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
496 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
497 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
498 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
499
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
500 ctx->name = *host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
501 ctx->handler = ngx_stream_proxy_resolve_handler;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
502 ctx->data = s;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
503 ctx->timeout = cscf->resolver_timeout;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
504
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
505 u->resolved->ctx = ctx;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
506
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
507 if (ngx_resolve_name(ctx) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
508 u->resolved->ctx = NULL;
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
509 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
510 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
511 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
512
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
513 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
514 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
515
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
516 found:
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
517
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
518 if (uscf == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
519 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "no upstream configuration");
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
520 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
521 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
522 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
523
6703
edcd9303a4d3 Upstream: introduced u->upstream.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6692
diff changeset
524 u->upstream = uscf;
edcd9303a4d3 Upstream: introduced u->upstream.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6692
diff changeset
525
6648
d43ee392e825 Stream: fixed build without stream_ssl_module (ticket #1032).
Vladimir Homutov <vl@nginx.com>
parents: 6643
diff changeset
526 #if (NGX_STREAM_SSL)
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
527 u->ssl_name = uscf->host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
528 #endif
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
529
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
530 if (uscf->peer.init(s, uscf) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
531 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
532 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
533 }
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 u->peer.start_time = ngx_current_msec;
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 if (pscf->next_upstream_tries
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
538 && u->peer.tries > pscf->next_upstream_tries)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
539 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
540 u->peer.tries = pscf->next_upstream_tries;
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
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
543 ngx_stream_proxy_connect(s);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
544 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
545
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
546
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
547 static ngx_int_t
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
548 ngx_stream_proxy_eval(ngx_stream_session_t *s,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
549 ngx_stream_proxy_srv_conf_t *pscf)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
550 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
551 ngx_str_t host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
552 ngx_url_t url;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
553 ngx_stream_upstream_t *u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
554
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
555 if (ngx_stream_complex_value(s, pscf->upstream_value, &host) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
556 return NGX_ERROR;
6115
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
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
559 ngx_memzero(&url, sizeof(ngx_url_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
560
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
561 url.url = host;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
562 url.no_resolve = 1;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
563
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
564 if (ngx_parse_url(s->connection->pool, &url) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
565 if (url.err) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
566 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
567 "%s in upstream \"%V\"", url.err, &url.url);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
568 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
569
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
570 return NGX_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
571 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
572
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
573 u = s->upstream;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
574
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
575 u->resolved = ngx_pcalloc(s->connection->pool,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
576 sizeof(ngx_stream_upstream_resolved_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
577 if (u->resolved == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
578 return NGX_ERROR;
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
579 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
580
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
581 if (url.addrs && url.addrs[0].sockaddr) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
582 u->resolved->sockaddr = url.addrs[0].sockaddr;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
583 u->resolved->socklen = url.addrs[0].socklen;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
584 u->resolved->naddrs = 1;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
585 u->resolved->host = url.addrs[0].name;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
586
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
587 } else {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
588 u->resolved->host = url.host;
6115
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
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
591 u->resolved->port = url.port;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
592 u->resolved->no_port = url.no_port;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
593
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
594 return NGX_OK;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
595 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
596
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
597
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
598 static ngx_int_t
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
599 ngx_stream_proxy_set_local(ngx_stream_session_t *s, ngx_stream_upstream_t *u,
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
600 ngx_stream_upstream_local_t *local)
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
601 {
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
602 ngx_int_t rc;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
603 ngx_str_t val;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
604 ngx_addr_t *addr;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
605
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
606 if (local == NULL) {
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
607 u->peer.local = NULL;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
608 return NGX_OK;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
609 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
610
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
611 #if (NGX_HAVE_TRANSPARENT_PROXY)
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
612 u->peer.transparent = local->transparent;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
613 #endif
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
614
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
615 if (local->value == NULL) {
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
616 u->peer.local = local->addr;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
617 return NGX_OK;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
618 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
619
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
620 if (ngx_stream_complex_value(s, local->value, &val) != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
621 return NGX_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
622 }
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
623
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
624 if (val.len == 0) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
625 return NGX_OK;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
626 }
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
627
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
628 addr = ngx_palloc(s->connection->pool, sizeof(ngx_addr_t));
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
629 if (addr == NULL) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
630 return NGX_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
631 }
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
632
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
633 rc = ngx_parse_addr_port(s->connection->pool, addr, val.data, val.len);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
634 if (rc == NGX_ERROR) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
635 return NGX_ERROR;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
636 }
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
637
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
638 if (rc != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
639 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
640 "invalid local address \"%V\"", &val);
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
641 return NGX_OK;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
642 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
643
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
644 addr->name = val;
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
645 u->peer.local = addr;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
646
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
647 return NGX_OK;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
648 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
649
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
650
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
651 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
652 ngx_stream_proxy_connect(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
653 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
654 ngx_int_t rc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
655 ngx_connection_t *c, *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
656 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
657 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
658
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
659 c = s->connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
660
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
661 c->log->action = "connecting to upstream";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
662
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
663 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
664
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
665 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
666
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
667 u->connected = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
668 u->proxy_protocol = pscf->proxy_protocol;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
669
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
670 if (u->state) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
671 u->state->response_time = ngx_current_msec - u->state->response_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
672 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
673
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
674 u->state = ngx_array_push(s->upstream_states);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
675 if (u->state == NULL) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
676 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
677 return;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
678 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
679
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
680 ngx_memzero(u->state, sizeof(ngx_stream_upstream_state_t));
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
681
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
682 u->state->connect_time = (ngx_msec_t) -1;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
683 u->state->first_byte_time = (ngx_msec_t) -1;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
684 u->state->response_time = ngx_current_msec;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
685
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
686 rc = ngx_event_connect_peer(&u->peer);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
687
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
688 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "proxy connect: %i", rc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
689
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
690 if (rc == NGX_ERROR) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
691 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
692 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
693 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
694
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
695 u->state->peer = u->peer.name;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6674
diff changeset
696
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
697 if (rc == NGX_BUSY) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
698 ngx_log_error(NGX_LOG_ERR, c->log, 0, "no live upstreams");
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
699 ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
700 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
701 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
702
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
703 if (rc == NGX_DECLINED) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
704 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
705 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
706 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
707
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
708 /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
709
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
710 pc = u->peer.connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
711
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
712 pc->data = s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
713 pc->log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
714 pc->pool = c->pool;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
715 pc->read->log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
716 pc->write->log = c->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
717
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
718 if (rc != NGX_AGAIN) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
719 ngx_stream_proxy_init_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
720 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
721 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
722
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
723 pc->read->handler = ngx_stream_proxy_connect_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
724 pc->write->handler = ngx_stream_proxy_connect_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
725
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
726 ngx_add_timer(pc->write, pscf->connect_timeout);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
727 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
728
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
729
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
730 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
731 ngx_stream_proxy_init_upstream(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
732 {
6222
Vladimir Homutov <vl@nginx.com>
parents: 6221
diff changeset
733 int tcp_nodelay;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
734 u_char *p;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
735 ngx_chain_t *cl;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
736 ngx_connection_t *c, *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
737 ngx_log_handler_pt handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
738 ngx_stream_upstream_t *u;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
739 ngx_stream_core_srv_conf_t *cscf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
740 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
741
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
742 u = s->upstream;
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
743 pc = u->peer.connection;
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
744
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
745 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
746
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
747 if (pc->type == SOCK_STREAM
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
748 && cscf->tcp_nodelay
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
749 && pc->tcp_nodelay == NGX_TCP_NODELAY_UNSET)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
750 {
6221
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
751 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, "tcp_nodelay");
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
752
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
753 tcp_nodelay = 1;
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
754
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
755 if (setsockopt(pc->fd, IPPROTO_TCP, TCP_NODELAY,
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
756 (const void *) &tcp_nodelay, sizeof(int)) == -1)
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
757 {
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
758 ngx_connection_error(pc, ngx_socket_errno,
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
759 "setsockopt(TCP_NODELAY) failed");
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
760 ngx_stream_proxy_next_upstream(s);
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
761 return;
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
762 }
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
763
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
764 pc->tcp_nodelay = NGX_TCP_NODELAY_SET;
7565e056fad6 Stream: the "tcp_nodelay" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6217
diff changeset
765 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
766
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
767 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
6115
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 #if (NGX_STREAM_SSL)
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
770
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
771 if (pc->type == SOCK_STREAM && pscf->ssl) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
772
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
773 if (u->proxy_protocol) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
774 if (ngx_stream_proxy_send_proxy_protocol(s) != NGX_OK) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
775 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
776 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
777
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
778 u->proxy_protocol = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
779 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
780
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
781 if (pc->ssl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
782 ngx_stream_proxy_ssl_init_connection(s);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
783 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
784 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
785 }
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
786
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
787 #endif
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 c = s->connection;
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 if (c->log->log_level >= NGX_LOG_INFO) {
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
792 ngx_str_t str;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
793 u_char addr[NGX_SOCKADDR_STRLEN];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
794
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
795 str.len = NGX_SOCKADDR_STRLEN;
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
796 str.data = addr;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
797
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
798 if (ngx_connection_local_sockaddr(pc, &str, 1) == NGX_OK) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
799 handler = c->log->handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
800 c->log->handler = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
801
6461
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
802 ngx_log_error(NGX_LOG_INFO, c->log, 0,
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
803 "%sproxy %V connected to %V",
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
804 pc->type == SOCK_DGRAM ? "udp " : "",
6230
2a621245f4cf Win32: MSVC 2015 compatibility.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6222
diff changeset
805 &str, u->peer.name);
6115
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 c->log->handler = handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
808 }
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
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
811 u->state->connect_time = ngx_current_msec - u->state->response_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
812
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
813 c->log->action = "proxying connection";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
814
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
815 if (u->upstream_buf.start == NULL) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
816 p = ngx_pnalloc(c->pool, pscf->buffer_size);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
817 if (p == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
818 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
819 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
820 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
821
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
822 u->upstream_buf.start = p;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
823 u->upstream_buf.end = p + pscf->buffer_size;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
824 u->upstream_buf.pos = p;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
825 u->upstream_buf.last = p;
6115
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
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
828 if (c->buffer && c->buffer->pos < c->buffer->last) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
829 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
830 "stream proxy add preread buffer: %uz",
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
831 c->buffer->last - c->buffer->pos);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
832
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
833 cl = ngx_chain_get_free_buf(c->pool, &u->free);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
834 if (cl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
835 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
836 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
837 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
838
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
839 *cl->buf = *c->buffer;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
840
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
841 cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
842 cl->buf->flush = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
843 cl->buf->last_buf = (c->type == SOCK_DGRAM);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
844
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
845 cl->next = u->upstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
846 u->upstream_out = cl;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
847 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
848
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
849 if (u->proxy_protocol) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
850 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
851 "stream proxy add PROXY protocol header");
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
852
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
853 cl = ngx_chain_get_free_buf(c->pool, &u->free);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
854 if (cl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
855 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
856 return;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
857 }
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
858
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
859 p = ngx_pnalloc(c->pool, NGX_PROXY_PROTOCOL_MAX_HEADER);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
860 if (p == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
861 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
862 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
863 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
864
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
865 cl->buf->pos = p;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
866
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
867 p = ngx_proxy_protocol_write(c, p, p + NGX_PROXY_PROTOCOL_MAX_HEADER);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
868 if (p == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
869 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
870 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
871 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
872
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
873 cl->buf->last = p;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
874 cl->buf->temporary = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
875 cl->buf->flush = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
876 cl->buf->last_buf = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
877 cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
878
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
879 cl->next = u->upstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
880 u->upstream_out = cl;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
881
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
882 u->proxy_protocol = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
883 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
884
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
885 if (c->type == SOCK_DGRAM && pscf->responses == 0) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
886 pc->read->ready = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
887 pc->read->eof = 1;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
888 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
889
6202
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
890 u->connected = 1;
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
891
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
892 pc->read->handler = ngx_stream_proxy_upstream_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
893 pc->write->handler = ngx_stream_proxy_upstream_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
894
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
895 if (pc->read->ready || pc->read->eof) {
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
896 ngx_post_event(pc->read, &ngx_posted_events);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
897 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
898
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
899 ngx_stream_proxy_process(s, 0, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
900 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
901
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
902
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
903 #if (NGX_STREAM_SSL)
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
904
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
905 static ngx_int_t
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
906 ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s)
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
907 {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
908 u_char *p;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
909 ssize_t n, size;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
910 ngx_connection_t *c, *pc;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
911 ngx_stream_upstream_t *u;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
912 ngx_stream_proxy_srv_conf_t *pscf;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
913 u_char buf[NGX_PROXY_PROTOCOL_MAX_HEADER];
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
914
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
915 c = s->connection;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
916
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
917 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
918 "stream proxy send PROXY protocol header");
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
919
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
920 p = ngx_proxy_protocol_write(c, buf, buf + NGX_PROXY_PROTOCOL_MAX_HEADER);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
921 if (p == NULL) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
922 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
923 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
924 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
925
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
926 u = s->upstream;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
927
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
928 pc = u->peer.connection;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
929
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
930 size = p - buf;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
931
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
932 n = pc->send(pc, buf, size);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
933
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
934 if (n == NGX_AGAIN) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
935 if (ngx_handle_write_event(pc->write, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
936 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
937 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
938 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
939
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
940 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
941
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
942 ngx_add_timer(pc->write, pscf->timeout);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
943
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
944 pc->write->handler = ngx_stream_proxy_connect_handler;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
945
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
946 return NGX_AGAIN;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
947 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
948
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
949 if (n == NGX_ERROR) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
950 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
951 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
952 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
953
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
954 if (n != size) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
955
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
956 /*
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
957 * PROXY protocol specification:
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
958 * The sender must always ensure that the header
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
959 * is sent at once, so that the transport layer
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
960 * maintains atomicity along the path to the receiver.
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
961 */
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
962
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
963 ngx_log_error(NGX_LOG_ERR, c->log, 0,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
964 "could not send PROXY protocol header at once");
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
965
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
966 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
967
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
968 return NGX_ERROR;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
969 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
970
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
971 return NGX_OK;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
972 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
973
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
974
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
975 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
976 ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
977 void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
978 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
979 ngx_stream_proxy_srv_conf_t *pscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
980
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
981 ngx_str_t *value;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
982
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
983 if (pscf->ssl_passwords != NGX_CONF_UNSET_PTR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
984 return "is duplicate";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
985 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
986
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
987 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
988
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
989 pscf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
990
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
991 if (pscf->ssl_passwords == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
992 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
993 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
994
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
995 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
996 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
997
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
998
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
999 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1000 ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1001 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1002 ngx_int_t rc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1003 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1004 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1005 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1006
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1007 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1008
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1009 pc = u->peer.connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1010
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1011 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1012
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1013 if (ngx_ssl_create_connection(pscf->ssl, pc, NGX_SSL_BUFFER|NGX_SSL_CLIENT)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1014 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1015 {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1016 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1017 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1018 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1019
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1020 if (pscf->ssl_server_name || pscf->ssl_verify) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1021 if (ngx_stream_proxy_ssl_name(s) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1022 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1023 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1024 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1025 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1026
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1027 if (pscf->ssl_session_reuse) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1028 if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1029 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1030 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1031 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1032 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1033
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1034 s->connection->log->action = "SSL handshaking to upstream";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1035
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1036 rc = ngx_ssl_handshake(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1037
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1038 if (rc == NGX_AGAIN) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1039
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1040 if (!pc->write->timer_set) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1041 ngx_add_timer(pc->write, pscf->connect_timeout);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1042 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1043
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1044 pc->ssl->handler = ngx_stream_proxy_ssl_handshake;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1045 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1046 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1047
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1048 ngx_stream_proxy_ssl_handshake(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1049 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1050
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1051
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1052 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1053 ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1054 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1055 long rc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1056 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1057 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1058 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1059
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1060 s = pc->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1061
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1062 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1063
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1064 if (pc->ssl->handshaked) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1065
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1066 if (pscf->ssl_verify) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1067 rc = SSL_get_verify_result(pc->ssl->connection);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1068
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1069 if (rc != X509_V_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1070 ngx_log_error(NGX_LOG_ERR, pc->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1071 "upstream SSL certificate verify error: (%l:%s)",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1072 rc, X509_verify_cert_error_string(rc));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1073 goto failed;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1074 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1075
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1076 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1077
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1078 if (ngx_ssl_check_host(pc, &u->ssl_name) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1079 ngx_log_error(NGX_LOG_ERR, pc->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1080 "upstream SSL certificate does not match \"%V\"",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1081 &u->ssl_name);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1082 goto failed;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1083 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1084 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1085
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1086 if (pscf->ssl_session_reuse) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1087 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1088 u->peer.save_session(&u->peer, u->peer.data);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1089 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1090
6258
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1091 if (pc->write->timer_set) {
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1092 ngx_del_timer(pc->write);
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1093 }
4b4aee40c508 Stream: delete proxy connection timer after SSL handshake.
Ruslan Ermilov <ru@nginx.com>
parents: 6230
diff changeset
1094
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1095 ngx_stream_proxy_init_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1096
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1097 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1098 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1099
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1100 failed:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1101
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1102 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1103 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1104
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1105
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1106 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1107 ngx_stream_proxy_ssl_name(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1108 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1109 u_char *p, *last;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1110 ngx_str_t name;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1111 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1112 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1113
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1114 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1116 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1117
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1118 if (pscf->ssl_name) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1119 if (ngx_stream_complex_value(s, pscf->ssl_name, &name) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1120 return NGX_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1121 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1122
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1123 } else {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1124 name = u->ssl_name;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1125 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1126
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1127 if (name.len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1128 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1129 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1130
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1131 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1132 * ssl name here may contain port, strip it for compatibility
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1133 * with the http module
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1134 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1135
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1136 p = name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1137 last = name.data + name.len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1138
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1139 if (*p == '[') {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1140 p = ngx_strlchr(p, last, ']');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1141
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1142 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1143 p = name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1144 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1145 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1146
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1147 p = ngx_strlchr(p, last, ':');
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1148
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1149 if (p != NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1150 name.len = p - name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1151 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1152
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1153 if (!pscf->ssl_server_name) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1154 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1155 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1156
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1157 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1158
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1159 /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1160
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1161 if (name.len == 0 || *name.data == '[') {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1162 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1163 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1164
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1165 if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1166 goto done;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1167 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1168
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1169 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1170 * SSL_set_tlsext_host_name() needs a null-terminated string,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1171 * hence we explicitly null-terminate name here
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1172 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1173
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1174 p = ngx_pnalloc(s->connection->pool, name.len + 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1175 if (p == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1176 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1177 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1178
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1179 (void) ngx_cpystrn(p, name.data, name.len + 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1180
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1181 name.data = p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1182
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1183 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1184 "upstream SSL server name: \"%s\"", name.data);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1185
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1186 if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection, name.data)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1187 == 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1188 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1189 ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1190 "SSL_set_tlsext_host_name(\"%s\") failed", name.data);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1191 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1192 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1193
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1194 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1195
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1196 done:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1197
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1198 u->ssl_name = name;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1199
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1200 return NGX_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1201 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1202
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1203 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1204
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1205
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1206 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1207 ngx_stream_proxy_downstream_handler(ngx_event_t *ev)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1208 {
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1209 ngx_stream_proxy_process_connection(ev, ev->write);
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1210 }
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1211
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1212
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1213 static void
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1214 ngx_stream_proxy_resolve_handler(ngx_resolver_ctx_t *ctx)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1215 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1216 ngx_stream_session_t *s;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1217 ngx_stream_upstream_t *u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1218 ngx_stream_proxy_srv_conf_t *pscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1219 ngx_stream_upstream_resolved_t *ur;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1220
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1221 s = ctx->data;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1222
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1223 u = s->upstream;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1224 ur = u->resolved;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1225
6648
d43ee392e825 Stream: fixed build without stream_ssl_module (ticket #1032).
Vladimir Homutov <vl@nginx.com>
parents: 6643
diff changeset
1226 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1227 "stream upstream resolve");
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1228
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1229 if (ctx->state) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1230 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1231 "%V could not be resolved (%i: %s)",
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1232 &ctx->name, ctx->state,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1233 ngx_resolver_strerror(ctx->state));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1234
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1235 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1236 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1237 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1238
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1239 ur->naddrs = ctx->naddrs;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1240 ur->addrs = ctx->addrs;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1241
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1242 #if (NGX_DEBUG)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1243 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1244 u_char text[NGX_SOCKADDR_STRLEN];
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1245 ngx_str_t addr;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1246 ngx_uint_t i;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1247
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1248 addr.data = text;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1249
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1250 for (i = 0; i < ctx->naddrs; i++) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1251 addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1252 text, NGX_SOCKADDR_STRLEN, 0);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1253
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1254 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1255 "name was resolved to %V", &addr);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1256 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1257 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1258 #endif
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1259
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1260 if (ngx_stream_upstream_create_round_robin_peer(s, ur) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1261 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1262 return;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1263 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1264
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1265 ngx_resolve_name_done(ctx);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1266 ur->ctx = NULL;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1267
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1268 u->peer.start_time = ngx_current_msec;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1269
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1270 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1271
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1272 if (pscf->next_upstream_tries
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1273 && u->peer.tries > pscf->next_upstream_tries)
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1274 {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1275 u->peer.tries = pscf->next_upstream_tries;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1276 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1277
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1278 ngx_stream_proxy_connect(s);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1279 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1280
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1281
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1282 static void
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1283 ngx_stream_proxy_upstream_handler(ngx_event_t *ev)
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1284 {
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1285 ngx_stream_proxy_process_connection(ev, !ev->write);
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1286 }
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1287
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1288
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1289 static void
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1290 ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream)
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1291 {
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1292 ngx_connection_t *c, *pc;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1293 ngx_stream_session_t *s;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1294 ngx_stream_upstream_t *u;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1295 ngx_stream_proxy_srv_conf_t *pscf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1296
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1297 c = ev->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1298 s = c->data;
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1299 u = s->upstream;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1300
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1301 c = s->connection;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1302 pc = u->peer.connection;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1303
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1304 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1305
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1306 if (ev->timedout) {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1307 ev->timedout = 0;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1308
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1309 if (ev->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1310 ev->delayed = 0;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1311
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1312 if (!ev->ready) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1313 if (ngx_handle_read_event(ev, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1314 ngx_stream_proxy_finalize(s,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1315 NGX_STREAM_INTERNAL_SERVER_ERROR);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1316 return;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1317 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1318
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1319 if (u->connected && !c->read->delayed && !pc->read->delayed) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1320 ngx_add_timer(c->write, pscf->timeout);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1321 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1322
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1323 return;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1324 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1325
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1326 } else {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1327 if (s->connection->type == SOCK_DGRAM) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1328 if (pscf->responses == NGX_MAX_INT32_VALUE) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1329
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1330 /*
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1331 * successfully terminate timed out UDP session
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1332 * with unspecified number of responses
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1333 */
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1334
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1335 pc->read->ready = 0;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1336 pc->read->eof = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1337
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1338 ngx_stream_proxy_process(s, 1, 0);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1339 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1340 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1341
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1342 if (u->received == 0) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1343 ngx_stream_proxy_next_upstream(s);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1344 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1345 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1346 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1347
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1348 ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out");
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1349 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1350 return;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1351 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1352
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1353 } else if (ev->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1354
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1355 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1356 "stream connection delayed");
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1357
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1358 if (ngx_handle_read_event(ev, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1359 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1360 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1361
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1362 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1363 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1364
6202
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
1365 if (from_upstream && !u->connected) {
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1366 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1367 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1368
6200
abee77018d3a Stream: common handler for upstream and downstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
1369 ngx_stream_proxy_process(s, from_upstream, ev->write);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1370 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1371
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1372
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1373 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1374 ngx_stream_proxy_connect_handler(ngx_event_t *ev)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1375 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1376 ngx_connection_t *c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1377 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1378
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1379 c = ev->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1380 s = c->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1381
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1382 if (ev->timedout) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1383 ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "upstream timed out");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1384 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1385 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1386 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1387
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1388 ngx_del_timer(c->write);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1389
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1390 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1391 "stream proxy connect upstream");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1392
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1393 if (ngx_stream_proxy_test_connect(c) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1394 ngx_stream_proxy_next_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1395 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1396 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1397
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1398 ngx_stream_proxy_init_upstream(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1399 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1400
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1401
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1402 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1403 ngx_stream_proxy_test_connect(ngx_connection_t *c)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1404 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1405 int err;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1406 socklen_t len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1407
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1408 #if (NGX_HAVE_KQUEUE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1409
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1410 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1411 err = c->write->kq_errno ? c->write->kq_errno : c->read->kq_errno;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1412
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1413 if (err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1414 (void) ngx_connection_error(c, err,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1415 "kevent() reported that connect() failed");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1416 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1417 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1418
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1419 } else
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1420 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1421 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1422 err = 0;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1423 len = sizeof(int);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1424
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1425 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1426 * BSDs and Linux return 0 and set a pending error in err
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1427 * Solaris returns -1 and sets errno
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1428 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1429
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1430 if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1431 == -1)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1432 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1433 err = ngx_socket_errno;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1434 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1435
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1436 if (err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1437 (void) ngx_connection_error(c, err, "connect() failed");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1438 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1439 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1440 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1441
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1442 return NGX_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1443 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1444
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1445
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1446 static void
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1447 ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1448 ngx_uint_t do_write)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1449 {
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1450 off_t *received, limit;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1451 size_t size, limit_rate;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1452 ssize_t n;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1453 ngx_buf_t *b;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1454 ngx_int_t rc;
6124
f1f222db290b Stream: prevent repeated event notifications after eof.
Roman Arutyunyan <arut@nginx.com>
parents: 6115
diff changeset
1455 ngx_uint_t flags;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1456 ngx_msec_t delay;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1457 ngx_chain_t *cl, **ll, **out, **busy;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1458 ngx_connection_t *c, *pc, *src, *dst;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1459 ngx_log_handler_pt handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1460 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1461 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1462
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1463 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1464
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1465 c = s->connection;
6202
6345822f0abb Stream: upstream "connected" flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6201
diff changeset
1466 pc = u->connected ? u->peer.connection : NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1467
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1468 if (c->type == SOCK_DGRAM && (ngx_terminate || ngx_exiting)) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1469
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1470 /* socket is already closed on worker shutdown */
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1471
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1472 handler = c->log->handler;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1473 c->log->handler = NULL;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1474
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1475 ngx_log_error(NGX_LOG_INFO, c->log, 0, "disconnected on shutdown");
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1476
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1477 c->log->handler = handler;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1478
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1479 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1480 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1481 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1482
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1483 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1484
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1485 if (from_upstream) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1486 src = pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1487 dst = c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1488 b = &u->upstream_buf;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1489 limit_rate = pscf->download_rate;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1490 received = &u->received;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1491 out = &u->downstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1492 busy = &u->downstream_busy;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1493
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1494 } else {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1495 src = c;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1496 dst = pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1497 b = &u->downstream_buf;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1498 limit_rate = pscf->upload_rate;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1499 received = &s->received;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1500 out = &u->upstream_out;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1501 busy = &u->upstream_busy;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1502 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1503
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1504 for ( ;; ) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1505
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1506 if (do_write && dst) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1507
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1508 if (*out || *busy || dst->buffered) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1509 rc = ngx_stream_top_filter(s, *out, from_upstream);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1510
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1511 if (rc == NGX_ERROR) {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1512 if (c->type == SOCK_DGRAM && !from_upstream) {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1513 ngx_stream_proxy_next_upstream(s);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1514 return;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1515 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1516
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1517 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1518 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1519 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1520
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1521 ngx_chain_update_chains(c->pool, &u->free, busy, out,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1522 (ngx_buf_tag_t) &ngx_stream_proxy_module);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1523
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1524 if (*busy == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1525 b->pos = b->start;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1526 b->last = b->start;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1527 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1528 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1529 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1530
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1531 size = b->end - b->last;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1532
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1533 if (size && src->read->ready && !src->read->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1534
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1535 if (limit_rate) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1536 limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1)
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1537 - *received;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1538
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1539 if (limit <= 0) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1540 src->read->delayed = 1;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1541 delay = (ngx_msec_t) (- limit * 1000 / limit_rate + 1);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1542 ngx_add_timer(src->read, delay);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1543 break;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1544 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1545
6204
114d1f8cdcab Stream: fixed possible integer overflow in rate limiting.
Valentin Bartenev <vbart@nginx.com>
parents: 6203
diff changeset
1546 if ((off_t) size > limit) {
6203
fdfdcad62875 Stream: fixed MSVC compilation warning.
Roman Arutyunyan <arut@nginx.com>
parents: 6202
diff changeset
1547 size = (size_t) limit;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1548 }
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1549 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1550
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1551 n = src->recv(src, b->last, size);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1552
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1553 if (n == NGX_AGAIN) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1554 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1555 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1556
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1557 if (n == NGX_ERROR) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1558 if (c->type == SOCK_DGRAM && u->received == 0) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1559 ngx_stream_proxy_next_upstream(s);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1560 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1561 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1562
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1563 src->read->eof = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1564 n = 0;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1565 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1566
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1567 if (n >= 0) {
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1568 if (limit_rate) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1569 delay = (ngx_msec_t) (n * 1000 / limit_rate);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1570
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1571 if (delay > 0) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1572 src->read->delayed = 1;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1573 ngx_add_timer(src->read, delay);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1574 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1575 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1576
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1577 if (from_upstream) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1578 if (u->state->first_byte_time == (ngx_msec_t) -1) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1579 u->state->first_byte_time = ngx_current_msec
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1580 - u->state->response_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1581 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1582 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1583
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1584 if (c->type == SOCK_DGRAM && ++u->responses == pscf->responses)
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1585 {
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1586 src->read->ready = 0;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1587 src->read->eof = 1;
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1588 }
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1589
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1590 for (ll = out; *ll; ll = &(*ll)->next) { /* void */ }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1591
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1592 cl = ngx_chain_get_free_buf(c->pool, &u->free);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1593 if (cl == NULL) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1594 ngx_stream_proxy_finalize(s,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1595 NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1596 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1597 }
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1598
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1599 *ll = cl;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1600
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1601 cl->buf->pos = b->last;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1602 cl->buf->last = b->last + n;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1603 cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1604
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1605 cl->buf->temporary = (n ? 1 : 0);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1606 cl->buf->last_buf = src->read->eof;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1607 cl->buf->flush = 1;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1608
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1609 *received += n;
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1610 b->last += n;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1611 do_write = 1;
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1612
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1613 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1614 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1615 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1616
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1617 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1618 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1619
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1620 if (src->read->eof && dst && (dst->read->eof || !dst->buffered)) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1621 handler = c->log->handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1622 c->log->handler = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1623
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1624 ngx_log_error(NGX_LOG_INFO, c->log, 0,
6461
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
1625 "%s%s disconnected"
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1626 ", bytes from/to client:%O/%O"
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1627 ", bytes from/to upstream:%O/%O",
6461
a01e315b3a78 Stream: additional logging for UDP.
Vladimir Homutov <vl@nginx.com>
parents: 6436
diff changeset
1628 src->type == SOCK_DGRAM ? "udp " : "",
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1629 from_upstream ? "upstream" : "client",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1630 s->received, c->sent, u->received, pc ? pc->sent : 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1631
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1632 c->log->handler = handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1633
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1634 ngx_stream_proxy_finalize(s, NGX_STREAM_OK);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1635 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1636 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1637
6124
f1f222db290b Stream: prevent repeated event notifications after eof.
Roman Arutyunyan <arut@nginx.com>
parents: 6115
diff changeset
1638 flags = src->read->eof ? NGX_CLOSE_EVENT : 0;
f1f222db290b Stream: prevent repeated event notifications after eof.
Roman Arutyunyan <arut@nginx.com>
parents: 6115
diff changeset
1639
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1640 if (!src->shared && ngx_handle_read_event(src->read, flags) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1641 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1642 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1643 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1644
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1645 if (dst) {
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1646 if (!dst->shared && ngx_handle_write_event(dst->write, 0) != NGX_OK) {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1647 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
6435
d1c791479bbb Stream: post first read events from client and upstream.
Roman Arutyunyan <arut@nginx.com>
parents: 6393
diff changeset
1648 return;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1649 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1650
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1651 if (!c->read->delayed && !pc->read->delayed) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1652 ngx_add_timer(c->write, pscf->timeout);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1653
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1654 } else if (c->write->timer_set) {
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1655 ngx_del_timer(c->write);
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1656 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1657 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1658 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1659
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1660
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1661 static void
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1662 ngx_stream_proxy_next_upstream(ngx_stream_session_t *s)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1663 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1664 ngx_msec_t timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1665 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1666 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1667 ngx_stream_proxy_srv_conf_t *pscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1668
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1669 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1670 "stream proxy next upstream");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1671
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1672 u = s->upstream;
6692
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1673 pc = u->peer.connection;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1674
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1675 if (u->upstream_out || u->upstream_busy || (pc && pc->buffered)) {
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1676 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1677 "pending buffers on next upstream");
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1678 ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1679 return;
56fc55e32f23 Stream: filters.
Roman Arutyunyan <arut@nginx.com>
parents: 6677
diff changeset
1680 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1681
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1682 if (u->peer.sockaddr) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1683 u->peer.free(&u->peer, u->peer.data, NGX_PEER_FAILED);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1684 u->peer.sockaddr = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1685 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1686
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1687 pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1688
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1689 timeout = pscf->next_upstream_timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1690
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1691 if (u->peer.tries == 0
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1692 || !pscf->next_upstream
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1693 || (timeout && ngx_current_msec - u->peer.start_time >= timeout))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1694 {
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1695 ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1696 return;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1697 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1698
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1699 if (pc) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1700 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1701 "close proxy upstream connection: %d", pc->fd);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1702
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1703 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1704 if (pc->ssl) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1705 pc->ssl->no_wait_shutdown = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1706 pc->ssl->no_send_shutdown = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1707
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1708 (void) ngx_ssl_shutdown(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1709 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1710 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1711
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1712 u->state->bytes_received = u->received;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1713 u->state->bytes_sent = pc->sent;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1714
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1715 ngx_close_connection(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1716 u->peer.connection = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1717 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1718
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1719 ngx_stream_proxy_connect(s);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1720 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1721
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1722
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1723 static void
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1724 ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1725 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1726 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1727 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1728
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1729 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1730 "finalize stream proxy: %i", rc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1731
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1732 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1733
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1734 if (u == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1735 goto noupstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1736 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1737
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1738 if (u->resolved && u->resolved->ctx) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1739 ngx_resolve_name_done(u->resolved->ctx);
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1740 u->resolved->ctx = NULL;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1741 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1742
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1743 pc = u->peer.connection;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1744
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1745 if (u->state) {
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1746 u->state->response_time = ngx_current_msec - u->state->response_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
1747
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1748 if (pc) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1749 u->state->bytes_received = u->received;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1750 u->state->bytes_sent = pc->sent;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1751 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1752 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
1753
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1754 if (u->peer.free && u->peer.sockaddr) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1755 u->peer.free(&u->peer, u->peer.data, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1756 u->peer.sockaddr = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1757 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1758
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1759 if (pc) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1760 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1761 "close stream proxy upstream connection: %d", pc->fd);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1762
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1763 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1764 if (pc->ssl) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1765 pc->ssl->no_wait_shutdown = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1766 (void) ngx_ssl_shutdown(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1767 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1768 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1769
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1770 ngx_close_connection(pc);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1771 u->peer.connection = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1772 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1773
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1774 noupstream:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1775
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6648
diff changeset
1776 ngx_stream_finalize_session(s, rc);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1777 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1778
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1779
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1780 static u_char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1781 ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf, size_t len)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1782 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1783 u_char *p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1784 ngx_connection_t *pc;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1785 ngx_stream_session_t *s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1786 ngx_stream_upstream_t *u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1787
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1788 s = log->data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1789
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1790 u = s->upstream;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1791
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1792 p = buf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1793
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1794 if (u->peer.name) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1795 p = ngx_snprintf(p, len, ", upstream: \"%V\"", u->peer.name);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1796 len -= p - buf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1797 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1798
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1799 pc = u->peer.connection;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1800
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1801 p = ngx_snprintf(p, len,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1802 ", bytes from/to client:%O/%O"
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1803 ", bytes from/to upstream:%O/%O",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1804 s->received, s->connection->sent,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1805 u->received, pc ? pc->sent : 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1806
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1807 return p;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1808 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1809
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1810
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1811 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1812 ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1813 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1814 ngx_stream_proxy_srv_conf_t *conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1815
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1816 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_proxy_srv_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1817 if (conf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1818 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1819 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1820
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1821 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1822 * set by ngx_pcalloc():
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1823 *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1824 * conf->ssl_protocols = 0;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1825 * conf->ssl_ciphers = { 0, NULL };
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1826 * conf->ssl_name = NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1827 * conf->ssl_trusted_certificate = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1828 * conf->ssl_crl = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1829 * conf->ssl_certificate = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1830 * conf->ssl_certificate_key = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1831 *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1832 * conf->ssl = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1833 * conf->upstream = NULL;
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1834 * conf->upstream_value = NULL;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1835 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1836
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1837 conf->connect_timeout = NGX_CONF_UNSET_MSEC;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1838 conf->timeout = NGX_CONF_UNSET_MSEC;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1839 conf->next_upstream_timeout = NGX_CONF_UNSET_MSEC;
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
1840 conf->buffer_size = NGX_CONF_UNSET_SIZE;
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1841 conf->upload_rate = NGX_CONF_UNSET_SIZE;
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1842 conf->download_rate = NGX_CONF_UNSET_SIZE;
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1843 conf->responses = NGX_CONF_UNSET_UINT;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1844 conf->next_upstream_tries = NGX_CONF_UNSET_UINT;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1845 conf->next_upstream = NGX_CONF_UNSET;
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
1846 conf->proxy_protocol = NGX_CONF_UNSET;
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
1847 conf->local = NGX_CONF_UNSET_PTR;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1848
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1849 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1850 conf->ssl_enable = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1851 conf->ssl_session_reuse = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1852 conf->ssl_server_name = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1853 conf->ssl_verify = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1854 conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1855 conf->ssl_passwords = NGX_CONF_UNSET_PTR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1856 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1857
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1858 return conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1859 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1860
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1861
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1862 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1863 ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1864 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1865 ngx_stream_proxy_srv_conf_t *prev = parent;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1866 ngx_stream_proxy_srv_conf_t *conf = child;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1867
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1868 ngx_conf_merge_msec_value(conf->connect_timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1869 prev->connect_timeout, 60000);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1870
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1871 ngx_conf_merge_msec_value(conf->timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1872 prev->timeout, 10 * 60000);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1873
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1874 ngx_conf_merge_msec_value(conf->next_upstream_timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1875 prev->next_upstream_timeout, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1876
6215
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
1877 ngx_conf_merge_size_value(conf->buffer_size,
8ee6a08ea3eb Stream: added proxy_buffer_size to set the size of data buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 6208
diff changeset
1878 prev->buffer_size, 16384);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1879
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1880 ngx_conf_merge_size_value(conf->upload_rate,
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1881 prev->upload_rate, 0);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1882
6208
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1883 ngx_conf_merge_size_value(conf->download_rate,
7a14a0d754ad Stream: renamed rate limiting directives.
Roman Arutyunyan <arut@nginx.com>
parents: 6204
diff changeset
1884 prev->download_rate, 0);
6201
24488e6db782 Stream: upstream and downstream limit rates.
Roman Arutyunyan <arut@nginx.com>
parents: 6200
diff changeset
1885
6436
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1886 ngx_conf_merge_uint_value(conf->responses,
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1887 prev->responses, NGX_MAX_INT32_VALUE);
8f038068f4bc Stream: UDP proxy.
Roman Arutyunyan <arut@nginx.com>
parents: 6435
diff changeset
1888
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1889 ngx_conf_merge_uint_value(conf->next_upstream_tries,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1890 prev->next_upstream_tries, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1891
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1892 ngx_conf_merge_value(conf->next_upstream, prev->next_upstream, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1893
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
1894 ngx_conf_merge_value(conf->proxy_protocol, prev->proxy_protocol, 0);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 6183
diff changeset
1895
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
1896 ngx_conf_merge_ptr_value(conf->local, prev->local, NULL);
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
1897
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1898 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1899
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1900 ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1901
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1902 ngx_conf_merge_value(conf->ssl_session_reuse,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1903 prev->ssl_session_reuse, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1904
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1905 ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
6157
b2899e7d0ef8 Disabled SSLv3 by default (ticket #653).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6124
diff changeset
1906 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
b2899e7d0ef8 Disabled SSLv3 by default (ticket #653).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6124
diff changeset
1907 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1908
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1909 ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, "DEFAULT");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1910
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1911 if (conf->ssl_name == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1912 conf->ssl_name = prev->ssl_name;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
1913 }
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1914
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1915 ngx_conf_merge_value(conf->ssl_server_name, prev->ssl_server_name, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1916
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1917 ngx_conf_merge_value(conf->ssl_verify, prev->ssl_verify, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1918
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1919 ngx_conf_merge_uint_value(conf->ssl_verify_depth,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1920 prev->ssl_verify_depth, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1921
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1922 ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1923 prev->ssl_trusted_certificate, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1924
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1925 ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1926
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1927 ngx_conf_merge_str_value(conf->ssl_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1928 prev->ssl_certificate, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1929
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1930 ngx_conf_merge_str_value(conf->ssl_certificate_key,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1931 prev->ssl_certificate_key, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1932
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1933 ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1934
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1935 if (conf->ssl_enable && ngx_stream_proxy_set_ssl(cf, conf) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1936 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1937 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1938
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1939 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1940
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1941 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1942 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1943
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1944
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1945 #if (NGX_STREAM_SSL)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1946
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1947 static ngx_int_t
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1948 ngx_stream_proxy_set_ssl(ngx_conf_t *cf, ngx_stream_proxy_srv_conf_t *pscf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1949 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1950 ngx_pool_cleanup_t *cln;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1951
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1952 pscf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1953 if (pscf->ssl == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1954 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1955 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1956
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1957 pscf->ssl->log = cf->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1958
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1959 if (ngx_ssl_create(pscf->ssl, pscf->ssl_protocols, NULL) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1960 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1961 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1962
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1963 cln = ngx_pool_cleanup_add(cf->pool, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1964 if (cln == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1965 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1966 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1967
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1968 cln->handler = ngx_ssl_cleanup_ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1969 cln->data = pscf->ssl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1970
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1971 if (pscf->ssl_certificate.len) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1972
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1973 if (pscf->ssl_certificate_key.len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1974 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1975 "no \"proxy_ssl_certificate_key\" is defined "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1976 "for certificate \"%V\"", &pscf->ssl_certificate);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1977 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1978 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1979
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1980 if (ngx_ssl_certificate(cf, pscf->ssl, &pscf->ssl_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1981 &pscf->ssl_certificate_key, pscf->ssl_passwords)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1982 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1983 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1984 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1985 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1986 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1987
6591
04d8d1f85649 SSL: ngx_ssl_ciphers() to set list of ciphers.
Tim Taubert <tim@timtaubert.de>
parents: 6530
diff changeset
1988 if (ngx_ssl_ciphers(cf, pscf->ssl, &pscf->ssl_ciphers, 0) != NGX_OK) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1989 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1990 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1991
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1992 if (pscf->ssl_verify) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1993 if (pscf->ssl_trusted_certificate.len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1994 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1995 "no proxy_ssl_trusted_certificate for proxy_ssl_verify");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1996 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1997 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1998
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1999 if (ngx_ssl_trusted_certificate(cf, pscf->ssl,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2000 &pscf->ssl_trusted_certificate,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2001 pscf->ssl_verify_depth)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2002 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2003 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2004 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2005 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2006
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2007 if (ngx_ssl_crl(cf, pscf->ssl, &pscf->ssl_crl) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2008 return NGX_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2009 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2010 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2011
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2012 return NGX_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2013 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2014
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2015 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2016
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2017
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2018 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2019 ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2020 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2021 ngx_stream_proxy_srv_conf_t *pscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2022
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2023 ngx_url_t u;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2024 ngx_str_t *value, *url;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2025 ngx_stream_complex_value_t cv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2026 ngx_stream_core_srv_conf_t *cscf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2027 ngx_stream_compile_complex_value_t ccv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2028
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2029 if (pscf->upstream || pscf->upstream_value) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2030 return "is duplicate";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2031 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2032
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2033 cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2034
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2035 cscf->handler = ngx_stream_proxy_handler;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2036
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2037 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2038
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2039 url = &value[1];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2040
6643
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2041 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2042
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2043 ccv.cf = cf;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2044 ccv.value = url;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2045 ccv.complex_value = &cv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2046
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2047 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2048 return NGX_CONF_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2049 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2050
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2051 if (cv.lengths) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2052 pscf->upstream_value = ngx_palloc(cf->pool,
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2053 sizeof(ngx_stream_complex_value_t));
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2054 if (pscf->upstream_value == NULL) {
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2055 return NGX_CONF_ERROR;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2056 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2057
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2058 *pscf->upstream_value = cv;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2059
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2060 return NGX_CONF_OK;
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2061 }
9757cffc1e2f Stream: variables in proxy_pass and proxy_ssl_name.
Vladimir Homutov <vl@nginx.com>
parents: 6610
diff changeset
2062
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2063 ngx_memzero(&u, sizeof(ngx_url_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2064
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2065 u.url = *url;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2066 u.no_resolve = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2067
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2068 pscf->upstream = ngx_stream_upstream_add(cf, &u, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2069 if (pscf->upstream == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2070 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2071 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2072
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2073 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2074 }
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2075
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2076
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2077 static char *
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2078 ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2079 {
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2080 ngx_stream_proxy_srv_conf_t *pscf = conf;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2081
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2082 ngx_int_t rc;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2083 ngx_str_t *value;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2084 ngx_stream_complex_value_t cv;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2085 ngx_stream_upstream_local_t *local;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2086 ngx_stream_compile_complex_value_t ccv;
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2087
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2088 if (pscf->local != NGX_CONF_UNSET_PTR) {
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2089 return "is duplicate";
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2090 }
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2091
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2092 value = cf->args->elts;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2093
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2094 if (cf->args->nelts == 2 && ngx_strcmp(value[1].data, "off") == 0) {
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2095 pscf->local = NULL;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2096 return NGX_CONF_OK;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2097 }
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2098
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2099 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2100
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2101 ccv.cf = cf;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2102 ccv.value = &value[1];
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2103 ccv.complex_value = &cv;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2104
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2105 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2106 return NGX_CONF_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2107 }
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2108
6598
4a724d6006ee Stream: use ngx_pcalloc() in ngx_stream_proxy_bind().
Roman Arutyunyan <arut@nginx.com>
parents: 6595
diff changeset
2109 local = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_local_t));
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2110 if (local == NULL) {
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2111 return NGX_CONF_ERROR;
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2112 }
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2113
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2114 pscf->local = local;
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2115
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2116 if (cv.lengths) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2117 local->value = ngx_palloc(cf->pool, sizeof(ngx_stream_complex_value_t));
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2118 if (local->value == NULL) {
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2119 return NGX_CONF_ERROR;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2120 }
6595
0c98c4092440 Stream: support for $remote_port in proxy_bind.
Roman Arutyunyan <arut@nginx.com>
parents: 6594
diff changeset
2121
6610
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2122 *local->value = cv;
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2123
d5b5866c06c4 Stream: got rid of pseudo variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
2124 } else {
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2125 local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2126 if (local->addr == NULL) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2127 return NGX_CONF_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2128 }
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2129
6594
3c87b82b17d4 Upstream: support for port in proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6593
diff changeset
2130 rc = ngx_parse_addr_port(cf->pool, local->addr, value[1].data,
3c87b82b17d4 Upstream: support for port in proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6593
diff changeset
2131 value[1].len);
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2132
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2133 switch (rc) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2134 case NGX_OK:
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2135 local->addr->name = value[1];
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2136 break;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2137
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2138 case NGX_DECLINED:
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2139 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2140 "invalid address \"%V\"", &value[1]);
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2141 /* fall through */
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2142
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2143 default:
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2144 return NGX_CONF_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2145 }
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2146 }
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2147
6530
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2148 if (cf->args->nelts > 2) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2149 if (ngx_strcmp(value[2].data, "transparent") == 0) {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2150 #if (NGX_HAVE_TRANSPARENT_PROXY)
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2151 local->transparent = 1;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2152 #else
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2153 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2154 "transparent proxying is not supported "
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2155 "on this platform, ignored");
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2156 #endif
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2157 } else {
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2158 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2159 "invalid parameter \"%V\"", &value[2]);
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2160 return NGX_CONF_ERROR;
1d0e03db9f8e Upstream: the "transparent" parameter of proxy_bind and friends.
Roman Arutyunyan <arut@nginx.com>
parents: 6529
diff changeset
2161 }
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2162 }
6529
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2163
cb8177ca0990 Stream: prepared proxy_bind to accept parameters.
Roman Arutyunyan <arut@nginx.com>
parents: 6461
diff changeset
2164 return NGX_CONF_OK;
6183
4dcffe43a7ea Stream: the "proxy_bind" directive.
Vladimir Homutov <vl@nginx.com>
parents: 6174
diff changeset
2165 }