annotate src/stream/ngx_stream_set_module.c @ 7713:45e9281c6c5b

Stream: set module. Adds 'set' directive to the stream server context.
author Pavel Pautov <p.pautov@f5.com>
date Fri, 28 Aug 2020 14:10:54 -0700
parents
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 }