annotate src/stream/ngx_stream_upstream.c @ 7054:e02555553d0b

Range filter: protect from total size overflows. The overflow can be used to circumvent the restriction on total size of ranges introduced in c2a91088b0c0 (1.1.2). Additionally, overflow allows producing ranges with negative start (such ranges can be created by using a suffix, "bytes=-100"; normally this results in 200 due to the total size check). These can result in the following errors in logs: [crit] ... pread() ... failed (22: Invalid argument) [alert] ... sendfile() failed (22: Invalid argument) When using cache, it can be also used to reveal cache file header. It is believed that there are no other negative effects, at least with standard nginx modules. In theory, this can also result in memory disclosure and/or segmentation faults if multiple ranges are allowed, and the response is returned in a single in-memory buffer. This never happens with standard nginx modules though, as well as known 3rd party modules. Fix is to properly protect from possible overflow when incrementing size.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 11 Jul 2017 16:06:23 +0300
parents 29bf0dbc0a77
children 2a288909abc6
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) Igor Sysoev
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
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
13 static ngx_int_t ngx_stream_upstream_add_variables(ngx_conf_t *cf);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
14 static ngx_int_t ngx_stream_upstream_addr_variable(ngx_stream_session_t *s,
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
15 ngx_stream_variable_value_t *v, uintptr_t data);
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
16 static ngx_int_t ngx_stream_upstream_response_time_variable(
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
17 ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data);
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
18 static ngx_int_t ngx_stream_upstream_bytes_variable(ngx_stream_session_t *s,
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
19 ngx_stream_variable_value_t *v, uintptr_t data);
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
20
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21 static char *ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22 void *dummy);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 static char *ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24 void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 static void *ngx_stream_upstream_create_main_conf(ngx_conf_t *cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
26 static char *ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
27
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
28
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
29 static ngx_command_t ngx_stream_upstream_commands[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31 { ngx_string("upstream"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32 NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
33 ngx_stream_upstream,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38 { ngx_string("server"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
39 NGX_STREAM_UPS_CONF|NGX_CONF_1MORE,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40 ngx_stream_upstream_server,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 ngx_null_command
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 static ngx_stream_module_t ngx_stream_upstream_module_ctx = {
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
50 ngx_stream_upstream_add_variables, /* preconfiguration */
6174
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6115
diff changeset
51 NULL, /* postconfiguration */
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6115
diff changeset
52
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 ngx_stream_upstream_create_main_conf, /* create main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 ngx_stream_upstream_init_main_conf, /* init main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 NULL, /* create server configuration */
6629
8ed51b02f655 Stream: style.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
57 NULL /* merge server configuration */
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 ngx_module_t ngx_stream_upstream_module = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62 NGX_MODULE_V1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63 &ngx_stream_upstream_module_ctx, /* module context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 ngx_stream_upstream_commands, /* module directives */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 NGX_STREAM_MODULE, /* module type */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 NULL, /* init master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 NULL, /* init module */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
68 NULL, /* init process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
69 NULL, /* init thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
70 NULL, /* exit thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
71 NULL, /* exit process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72 NULL, /* exit master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
73 NGX_MODULE_V1_PADDING
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
77 static ngx_stream_variable_t ngx_stream_upstream_vars[] = {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
78
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
79 { ngx_string("upstream_addr"), NULL,
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
80 ngx_stream_upstream_addr_variable, 0,
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
81 NGX_STREAM_VAR_NOCACHEABLE, 0 },
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
82
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
83 { ngx_string("upstream_bytes_sent"), NULL,
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
84 ngx_stream_upstream_bytes_variable, 0,
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
85 NGX_STREAM_VAR_NOCACHEABLE, 0 },
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
86
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
87 { ngx_string("upstream_connect_time"), NULL,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
88 ngx_stream_upstream_response_time_variable, 2,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
89 NGX_STREAM_VAR_NOCACHEABLE, 0 },
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
90
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
91 { ngx_string("upstream_first_byte_time"), NULL,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
92 ngx_stream_upstream_response_time_variable, 1,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
93 NGX_STREAM_VAR_NOCACHEABLE, 0 },
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
94
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
95 { ngx_string("upstream_session_time"), NULL,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
96 ngx_stream_upstream_response_time_variable, 0,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
97 NGX_STREAM_VAR_NOCACHEABLE, 0 },
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
98
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
99 { ngx_string("upstream_bytes_received"), NULL,
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
100 ngx_stream_upstream_bytes_variable, 1,
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
101 NGX_STREAM_VAR_NOCACHEABLE, 0 },
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
102
6675
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
103 { ngx_null_string, NULL, NULL, 0, 0, 0 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
104 };
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
105
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
106
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
107 static ngx_int_t
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
108 ngx_stream_upstream_add_variables(ngx_conf_t *cf)
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
109 {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
110 ngx_stream_variable_t *var, *v;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
111
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
112 for (v = ngx_stream_upstream_vars; v->name.len; v++) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
113 var = ngx_stream_add_variable(cf, &v->name, v->flags);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
114 if (var == NULL) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
115 return NGX_ERROR;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
116 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
117
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
118 var->get_handler = v->get_handler;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
119 var->data = v->data;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
120 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
121
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
122 return NGX_OK;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
123 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
124
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
125
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
126 static ngx_int_t
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
127 ngx_stream_upstream_addr_variable(ngx_stream_session_t *s,
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
128 ngx_stream_variable_value_t *v, uintptr_t data)
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
129 {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
130 u_char *p;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
131 size_t len;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
132 ngx_uint_t i;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
133 ngx_stream_upstream_state_t *state;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
134
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
135 v->valid = 1;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
136 v->no_cacheable = 0;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
137 v->not_found = 0;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
138
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
139 if (s->upstream_states == NULL || s->upstream_states->nelts == 0) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
140 v->not_found = 1;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
141 return NGX_OK;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
142 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
143
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
144 len = 0;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
145 state = s->upstream_states->elts;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
146
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
147 for (i = 0; i < s->upstream_states->nelts; i++) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
148 if (state[i].peer) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
149 len += state[i].peer->len;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
150 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
151
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
152 len += 2;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
153 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
154
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
155 p = ngx_pnalloc(s->connection->pool, len);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
156 if (p == NULL) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
157 return NGX_ERROR;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
158 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
159
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
160 v->data = p;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
161
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
162 i = 0;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
163
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
164 for ( ;; ) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
165 if (state[i].peer) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
166 p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
167 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
168
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
169 if (++i == s->upstream_states->nelts) {
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
170 break;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
171 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
172
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
173 *p++ = ',';
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
174 *p++ = ' ';
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
175 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
176
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
177 v->len = p - v->data;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
178
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
179 return NGX_OK;
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
180 }
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
181
ab9b4fd8c5b7 Stream: the $upstream_addr variable.
Vladimir Homutov <vl@nginx.com>
parents: 6629
diff changeset
182
6676
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
183 static ngx_int_t
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
184 ngx_stream_upstream_bytes_variable(ngx_stream_session_t *s,
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
185 ngx_stream_variable_value_t *v, uintptr_t data)
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
186 {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
187 u_char *p;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
188 size_t len;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
189 ngx_uint_t i;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
190 ngx_stream_upstream_state_t *state;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
191
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
192 v->valid = 1;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
193 v->no_cacheable = 0;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
194 v->not_found = 0;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
195
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
196 if (s->upstream_states == NULL || s->upstream_states->nelts == 0) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
197 v->not_found = 1;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
198 return NGX_OK;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
199 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
200
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
201 len = s->upstream_states->nelts * (NGX_OFF_T_LEN + 2);
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
202
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
203 p = ngx_pnalloc(s->connection->pool, len);
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
204 if (p == NULL) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
205 return NGX_ERROR;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
206 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
207
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
208 v->data = p;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
209
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
210 i = 0;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
211 state = s->upstream_states->elts;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
212
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
213 for ( ;; ) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
214
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
215 if (data == 1) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
216 p = ngx_sprintf(p, "%O", state[i].bytes_received);
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
217
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
218 } else {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
219 p = ngx_sprintf(p, "%O", state[i].bytes_sent);
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
220 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
221
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
222 if (++i == s->upstream_states->nelts) {
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
223 break;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
224 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
225
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
226 *p++ = ',';
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
227 *p++ = ' ';
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
228 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
229
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
230 v->len = p - v->data;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
231
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
232 return NGX_OK;
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
233 }
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
234
df3a7c029dec Stream: $upstream_bytes_sent and $upstream_bytes_received.
Vladimir Homutov <vl@nginx.com>
parents: 6675
diff changeset
235
6677
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
236 static ngx_int_t
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
237 ngx_stream_upstream_response_time_variable(ngx_stream_session_t *s,
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
238 ngx_stream_variable_value_t *v, uintptr_t data)
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
239 {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
240 u_char *p;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
241 size_t len;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
242 ngx_uint_t i;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
243 ngx_msec_int_t ms;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
244 ngx_stream_upstream_state_t *state;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
245
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
246 v->valid = 1;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
247 v->no_cacheable = 0;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
248 v->not_found = 0;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
249
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
250 if (s->upstream_states == NULL || s->upstream_states->nelts == 0) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
251 v->not_found = 1;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
252 return NGX_OK;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
253 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
254
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
255 len = s->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
256
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
257 p = ngx_pnalloc(s->connection->pool, len);
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
258 if (p == NULL) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
259 return NGX_ERROR;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
260 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
261
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
262 v->data = p;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
263
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
264 i = 0;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
265 state = s->upstream_states->elts;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
266
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
267 for ( ;; ) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
268
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
269 if (data == 1) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
270 if (state[i].first_byte_time == (ngx_msec_t) -1) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
271 *p++ = '-';
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
272 goto next;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
273 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
274
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
275 ms = state[i].first_byte_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
276
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
277 } else if (data == 2 && state[i].connect_time != (ngx_msec_t) -1) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
278 ms = state[i].connect_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
279
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
280 } else {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
281 ms = state[i].response_time;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
282 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
283
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
284 ms = ngx_max(ms, 0);
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
285 p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000);
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
286
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
287 next:
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
288
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
289 if (++i == s->upstream_states->nelts) {
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
290 break;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
291 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
292
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
293 *p++ = ',';
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
294 *p++ = ' ';
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
295 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
296
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
297 v->len = p - v->data;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
298
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
299 return NGX_OK;
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
300 }
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
301
c02290241cbe Stream: upstream response time variables.
Vladimir Homutov <vl@nginx.com>
parents: 6676
diff changeset
302
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
303 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
304 ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
305 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
306 char *rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
307 void *mconf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
308 ngx_str_t *value;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
309 ngx_url_t u;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
310 ngx_uint_t m;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
311 ngx_conf_t pcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
312 ngx_stream_module_t *module;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
313 ngx_stream_conf_ctx_t *ctx, *stream_ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
314 ngx_stream_upstream_srv_conf_t *uscf;
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_memzero(&u, sizeof(ngx_url_t));
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 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
319 u.host = value[1];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
320 u.no_resolve = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
321 u.no_port = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
322
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
323 uscf = ngx_stream_upstream_add(cf, &u, NGX_STREAM_UPSTREAM_CREATE
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
324 |NGX_STREAM_UPSTREAM_WEIGHT
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
325 |NGX_STREAM_UPSTREAM_MAX_CONNS
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
326 |NGX_STREAM_UPSTREAM_MAX_FAILS
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
327 |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
328 |NGX_STREAM_UPSTREAM_DOWN
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
329 |NGX_STREAM_UPSTREAM_BACKUP);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
330 if (uscf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
331 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
332 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
333
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
334
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
335 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
336 if (ctx == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
337 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
338 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
339
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
340 stream_ctx = cf->ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
341 ctx->main_conf = stream_ctx->main_conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
342
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
343 /* the upstream{}'s srv_conf */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
344
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
345 ctx->srv_conf = ngx_pcalloc(cf->pool,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
346 sizeof(void *) * ngx_stream_max_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
347 if (ctx->srv_conf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
348 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
349 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
350
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
351 ctx->srv_conf[ngx_stream_upstream_module.ctx_index] = uscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
352
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
353 uscf->srv_conf = ctx->srv_conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
354
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6174
diff changeset
355 for (m = 0; cf->cycle->modules[m]; m++) {
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6174
diff changeset
356 if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
357 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
358 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
359
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6174
diff changeset
360 module = cf->cycle->modules[m]->ctx;
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 if (module->create_srv_conf) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
363 mconf = module->create_srv_conf(cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
364 if (mconf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
365 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
366 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
367
6379
cf5e822cf470 Dynamic modules: changed ngx_modules to cycle->modules.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6174
diff changeset
368 ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
369 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
370 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
371
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
372 uscf->servers = ngx_array_create(cf->pool, 4,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
373 sizeof(ngx_stream_upstream_server_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
374 if (uscf->servers == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
375 return NGX_CONF_ERROR;
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
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 /* parse inside upstream{} */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
380
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
381 pcf = *cf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
382 cf->ctx = ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
383 cf->cmd_type = NGX_STREAM_UPS_CONF;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
384
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
385 rv = ngx_conf_parse(cf, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
386
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
387 *cf = pcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
388
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
389 if (rv != NGX_CONF_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
390 return rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
391 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
392
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
393 if (uscf->servers->nelts == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
394 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
395 "no servers are inside upstream");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
396 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
397 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
398
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
399 return rv;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
400 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
401
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
402
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
403 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
404 ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
405 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
406 ngx_stream_upstream_srv_conf_t *uscf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
407
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
408 time_t fail_timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
409 ngx_str_t *value, s;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
410 ngx_url_t u;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
411 ngx_int_t weight, max_conns, max_fails;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
412 ngx_uint_t i;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
413 ngx_stream_upstream_server_t *us;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
414
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
415 us = ngx_array_push(uscf->servers);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
416 if (us == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
417 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
418 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
419
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
420 ngx_memzero(us, sizeof(ngx_stream_upstream_server_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
421
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
422 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
423
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
424 weight = 1;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
425 max_conns = 0;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
426 max_fails = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
427 fail_timeout = 10;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
428
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
429 for (i = 2; i < cf->args->nelts; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
430
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
431 if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
432
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
433 if (!(uscf->flags & NGX_STREAM_UPSTREAM_WEIGHT)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
434 goto not_supported;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
435 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
436
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
437 weight = ngx_atoi(&value[i].data[7], value[i].len - 7);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
438
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
439 if (weight == NGX_ERROR || weight == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
440 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
441 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
442
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
443 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
444 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
445
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
446 if (ngx_strncmp(value[i].data, "max_conns=", 10) == 0) {
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
447
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
448 if (!(uscf->flags & NGX_STREAM_UPSTREAM_MAX_CONNS)) {
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
449 goto not_supported;
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
450 }
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
451
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
452 max_conns = ngx_atoi(&value[i].data[10], value[i].len - 10);
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
453
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
454 if (max_conns == NGX_ERROR) {
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
455 goto invalid;
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
456 }
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
457
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
458 continue;
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
459 }
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
460
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
461 if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
462
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
463 if (!(uscf->flags & NGX_STREAM_UPSTREAM_MAX_FAILS)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
464 goto not_supported;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
465 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
466
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
467 max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
468
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
469 if (max_fails == NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
470 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
471 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
472
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
473 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
474 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
475
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
476 if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
477
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
478 if (!(uscf->flags & NGX_STREAM_UPSTREAM_FAIL_TIMEOUT)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
479 goto not_supported;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
480 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
481
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
482 s.len = value[i].len - 13;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
483 s.data = &value[i].data[13];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
484
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
485 fail_timeout = ngx_parse_time(&s, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
486
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
487 if (fail_timeout == (time_t) NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
488 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
489 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
490
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
491 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
492 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
493
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
494 if (ngx_strcmp(value[i].data, "backup") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
495
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
496 if (!(uscf->flags & NGX_STREAM_UPSTREAM_BACKUP)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
497 goto not_supported;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
498 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
499
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
500 us->backup = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
501
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
502 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
503 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
504
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
505 if (ngx_strcmp(value[i].data, "down") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
506
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
507 if (!(uscf->flags & NGX_STREAM_UPSTREAM_DOWN)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
508 goto not_supported;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
509 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
510
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
511 us->down = 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
512
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
513 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
514 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
515
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
516 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
517 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
518
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
519 ngx_memzero(&u, sizeof(ngx_url_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
520
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
521 u.url = value[1];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
522
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
523 if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
524 if (u.err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
525 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
526 "%s in upstream \"%V\"", u.err, &u.url);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
527 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
528
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
529 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
530 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
531
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
532 if (u.no_port) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
533 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
534 "no port in upstream \"%V\"", &u.url);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
535 return NGX_CONF_ERROR;
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
538 us->name = u.url;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
539 us->addrs = u.addrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
540 us->naddrs = u.naddrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
541 us->weight = weight;
6705
29bf0dbc0a77 Upstream: max_conns.
Ruslan Ermilov <ru@nginx.com>
parents: 6699
diff changeset
542 us->max_conns = max_conns;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
543 us->max_fails = max_fails;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
544 us->fail_timeout = fail_timeout;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
545
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
546 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
547
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
548 invalid:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
549
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
550 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
551 "invalid parameter \"%V\"", &value[i]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
552
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
553 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
554
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
555 not_supported:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
556
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
557 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
558 "balancing method does not support parameter \"%V\"",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
559 &value[i]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
560
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
561 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
562 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
563
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
564
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
565 ngx_stream_upstream_srv_conf_t *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
566 ngx_stream_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
567 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
568 ngx_uint_t i;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
569 ngx_stream_upstream_server_t *us;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
570 ngx_stream_upstream_srv_conf_t *uscf, **uscfp;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
571 ngx_stream_upstream_main_conf_t *umcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
572
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
573 if (!(flags & NGX_STREAM_UPSTREAM_CREATE)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
574
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
575 if (ngx_parse_url(cf->pool, u) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
576 if (u->err) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
577 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
578 "%s in upstream \"%V\"", u->err, &u->url);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
579 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
580
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
581 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
582 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
583 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
584
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
585 umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
586
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
587 uscfp = umcf->upstreams.elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
588
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
589 for (i = 0; i < umcf->upstreams.nelts; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
590
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
591 if (uscfp[i]->host.len != u->host.len
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
592 || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
593 != 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
594 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
595 continue;
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
598 if ((flags & NGX_STREAM_UPSTREAM_CREATE)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
599 && (uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
600 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
601 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
602 "duplicate upstream \"%V\"", &u->host);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
603 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
604 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
605
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
606 if ((uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE) && !u->no_port) {
6699
9cf2dce316e5 Fixed log levels of configuration parsing errors.
Valentin Bartenev <vbart@nginx.com>
parents: 6677
diff changeset
607 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
608 "upstream \"%V\" may not have port %d",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
609 &u->host, u->port);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
610 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
611 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
612
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
613 if ((flags & NGX_STREAM_UPSTREAM_CREATE) && !uscfp[i]->no_port) {
6699
9cf2dce316e5 Fixed log levels of configuration parsing errors.
Valentin Bartenev <vbart@nginx.com>
parents: 6677
diff changeset
614 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
615 "upstream \"%V\" may not have port %d in %s:%ui",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
616 &u->host, uscfp[i]->port,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
617 uscfp[i]->file_name, uscfp[i]->line);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
618 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
619 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
620
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
621 if (uscfp[i]->port != u->port) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
622 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
623 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
624
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
625 if (flags & NGX_STREAM_UPSTREAM_CREATE) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
626 uscfp[i]->flags = flags;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
627 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
628
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
629 return uscfp[i];
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
630 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
631
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
632 uscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_srv_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
633 if (uscf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
634 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
635 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
636
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
637 uscf->flags = flags;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
638 uscf->host = u->host;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
639 uscf->file_name = cf->conf_file->file.name.data;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
640 uscf->line = cf->conf_file->line;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
641 uscf->port = u->port;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
642 uscf->no_port = u->no_port;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
643
6459
78fc2dce69e7 Stream: detect port absence in proxy_pass with IP literal.
Roman Arutyunyan <arut@nginx.com>
parents: 6379
diff changeset
644 if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
645 uscf->servers = ngx_array_create(cf->pool, 1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
646 sizeof(ngx_stream_upstream_server_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
647 if (uscf->servers == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
648 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
649 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
650
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
651 us = ngx_array_push(uscf->servers);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
652 if (us == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
653 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
654 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
655
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
656 ngx_memzero(us, sizeof(ngx_stream_upstream_server_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
657
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
658 us->addrs = u->addrs;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
659 us->naddrs = 1;
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
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
662 uscfp = ngx_array_push(&umcf->upstreams);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
663 if (uscfp == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
664 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
665 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
666
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
667 *uscfp = uscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
668
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
669 return uscf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
670 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
671
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
672
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
673 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
674 ngx_stream_upstream_create_main_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
675 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
676 ngx_stream_upstream_main_conf_t *umcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
677
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
678 umcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_main_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
679 if (umcf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
680 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
681 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
682
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
683 if (ngx_array_init(&umcf->upstreams, cf->pool, 4,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
684 sizeof(ngx_stream_upstream_srv_conf_t *))
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
685 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
686 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
687 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
688 }
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 return umcf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
691 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
692
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
693
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
694 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
695 ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
696 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
697 ngx_stream_upstream_main_conf_t *umcf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
698
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
699 ngx_uint_t i;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
700 ngx_stream_upstream_init_pt init;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
701 ngx_stream_upstream_srv_conf_t **uscfp;
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 uscfp = umcf->upstreams.elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
704
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
705 for (i = 0; i < umcf->upstreams.nelts; i++) {
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 init = uscfp[i]->peer.init_upstream
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
708 ? uscfp[i]->peer.init_upstream
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
709 : ngx_stream_upstream_init_round_robin;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
710
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
711 if (init(cf, uscfp[i]) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
712 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
713 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
714 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
715
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
716 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
717 }