annotate src/stream/ngx_stream_set_module.c @ 7731:fd0b2226919b

Stream: proxy_ssl_conf_command directive. Similarly to ssl_conf_command, proxy_ssl_conf_command can be used to set arbitrary OpenSSL configuration parameters as long as nginx is compiled with OpenSSL 1.0.2 or later, when connecting to upstream servers with SSL. Full list of available configuration commands can be found in the SSL_CONF_cmd manual page (https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html).
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 22 Oct 2020 18:00:27 +0300
parents 45e9281c6c5b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7713
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
1
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
2 /*
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
3 * Copyright (C) Pavel Pautov
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
5 */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
6
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
7
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
8 #include <ngx_config.h>
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
9 #include <ngx_core.h>
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
10 #include <ngx_stream.h>
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
11
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
12
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
13 typedef struct {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
14 ngx_int_t index;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
15 ngx_stream_set_variable_pt set_handler;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
16 uintptr_t data;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
17 ngx_stream_complex_value_t value;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
18 } ngx_stream_set_cmd_t;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
19
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
20
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
21 typedef struct {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
22 ngx_array_t commands;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
23 } ngx_stream_set_srv_conf_t;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
24
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
25
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
26 static ngx_int_t ngx_stream_set_handler(ngx_stream_session_t *s);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
27 static ngx_int_t ngx_stream_set_var(ngx_stream_session_t *s,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
28 ngx_stream_variable_value_t *v, uintptr_t data);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
29 static ngx_int_t ngx_stream_set_init(ngx_conf_t *cf);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
30 static void *ngx_stream_set_create_srv_conf(ngx_conf_t *cf);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
31 static char *ngx_stream_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
32
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
33
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
34 static ngx_command_t ngx_stream_set_commands[] = {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
35
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
36 { ngx_string("set"),
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
37 NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
38 ngx_stream_set,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
39 NGX_STREAM_SRV_CONF_OFFSET,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
40 0,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
41 NULL },
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
42
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
43 ngx_null_command
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
44 };
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
45
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
46
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
47 static ngx_stream_module_t ngx_stream_set_module_ctx = {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
48 NULL, /* preconfiguration */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
49 ngx_stream_set_init, /* postconfiguration */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
50
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
51 NULL, /* create main configuration */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
52 NULL, /* init main configuration */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
53
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
54 ngx_stream_set_create_srv_conf, /* create server configuration */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
55 NULL /* merge server configuration */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
56 };
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
57
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
58
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
59 ngx_module_t ngx_stream_set_module = {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
60 NGX_MODULE_V1,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
61 &ngx_stream_set_module_ctx, /* module context */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
62 ngx_stream_set_commands, /* module directives */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
63 NGX_STREAM_MODULE, /* module type */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
64 NULL, /* init master */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
65 NULL, /* init module */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
66 NULL, /* init process */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
67 NULL, /* init thread */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
68 NULL, /* exit thread */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
69 NULL, /* exit process */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
70 NULL, /* exit master */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
71 NGX_MODULE_V1_PADDING
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
72 };
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
73
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
74
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
75 static ngx_int_t
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
76 ngx_stream_set_handler(ngx_stream_session_t *s)
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
77 {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
78 ngx_str_t str;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
79 ngx_uint_t i;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
80 ngx_stream_set_cmd_t *cmds;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
81 ngx_stream_set_srv_conf_t *scf;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
82 ngx_stream_variable_value_t vv;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
83
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
84 scf = ngx_stream_get_module_srv_conf(s, ngx_stream_set_module);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
85 cmds = scf->commands.elts;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
86 vv = ngx_stream_variable_null_value;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
87
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
88 for (i = 0; i < scf->commands.nelts; i++) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
89 if (ngx_stream_complex_value(s, &cmds[i].value, &str) != NGX_OK) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
90 return NGX_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
91 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
92
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
93 if (cmds[i].set_handler != NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
94 vv.len = str.len;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
95 vv.data = str.data;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
96 cmds[i].set_handler(s, &vv, cmds[i].data);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
97
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
98 } else {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
99 s->variables[cmds[i].index].len = str.len;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
100 s->variables[cmds[i].index].valid = 1;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
101 s->variables[cmds[i].index].no_cacheable = 0;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
102 s->variables[cmds[i].index].not_found = 0;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
103 s->variables[cmds[i].index].data = str.data;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
104 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
105 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
106
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
107 return NGX_DECLINED;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
108 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
109
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
110
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
111 static ngx_int_t
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
112 ngx_stream_set_var(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
113 uintptr_t data)
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
114 {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
115 *v = ngx_stream_variable_null_value;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
116
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
117 return NGX_OK;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
118 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
119
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
120
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
121 static ngx_int_t
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
122 ngx_stream_set_init(ngx_conf_t *cf)
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
123 {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
124 ngx_stream_handler_pt *h;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
125 ngx_stream_core_main_conf_t *cmcf;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
126
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
127 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
128
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
129 h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREACCESS_PHASE].handlers);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
130 if (h == NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
131 return NGX_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
132 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
133
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
134 *h = ngx_stream_set_handler;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
135
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
136 return NGX_OK;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
137 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
138
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
139
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
140 static void *
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
141 ngx_stream_set_create_srv_conf(ngx_conf_t *cf)
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
142 {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
143 ngx_stream_set_srv_conf_t *conf;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
144
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
145 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_set_srv_conf_t));
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
146 if (conf == NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
147 return NULL;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
148 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
149
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
150 /*
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
151 * set by ngx_pcalloc():
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
152 *
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
153 * conf->commands = { NULL };
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
154 */
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
155
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
156 return conf;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
157 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
158
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
159
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
160 static char *
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
161 ngx_stream_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
162 {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
163 ngx_stream_set_srv_conf_t *scf = conf;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
164
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
165 ngx_str_t *args;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
166 ngx_int_t index;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
167 ngx_stream_set_cmd_t *set_cmd;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
168 ngx_stream_variable_t *v;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
169 ngx_stream_compile_complex_value_t ccv;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
170
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
171 args = cf->args->elts;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
172
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
173 if (args[1].data[0] != '$') {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
174 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
175 "invalid variable name \"%V\"", &args[1]);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
176 return NGX_CONF_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
177 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
178
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
179 args[1].len--;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
180 args[1].data++;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
181
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
182 v = ngx_stream_add_variable(cf, &args[1],
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
183 NGX_STREAM_VAR_CHANGEABLE|NGX_STREAM_VAR_WEAK);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
184 if (v == NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
185 return NGX_CONF_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
186 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
187
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
188 index = ngx_stream_get_variable_index(cf, &args[1]);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
189 if (index == NGX_ERROR) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
190 return NGX_CONF_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
191 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
192
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
193 if (v->get_handler == NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
194 v->get_handler = ngx_stream_set_var;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
195 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
196
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
197 if (scf->commands.elts == NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
198 if (ngx_array_init(&scf->commands, cf->pool, 1,
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
199 sizeof(ngx_stream_set_cmd_t))
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
200 != NGX_OK)
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
201 {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
202 return NGX_CONF_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
203 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
204 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
205
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
206 set_cmd = ngx_array_push(&scf->commands);
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
207 if (set_cmd == NULL) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
208 return NGX_CONF_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
209 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
210
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
211 set_cmd->index = index;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
212 set_cmd->set_handler = v->set_handler;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
213 set_cmd->data = v->data;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
214
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
215 ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
216
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
217 ccv.cf = cf;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
218 ccv.value = &args[2];
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
219 ccv.complex_value = &set_cmd->value;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
220
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
221 if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
222 return NGX_CONF_ERROR;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
223 }
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
224
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
225 return NGX_CONF_OK;
45e9281c6c5b Stream: set module.
Pavel Pautov <p.pautov@f5.com>
parents:
diff changeset
226 }