comparison src/stream/ngx_stream_script.c @ 7503:b82162b8496a

Added ngx_http_set_complex_value_size_slot(). If a complex value is expected to be of type size_t, and the compiled value is constant, the constant size_t value is remembered at compile time. The value is accessed through ngx_http_complex_value_size() which either returns the remembered constant or evaluates the expression and parses it as size_t.
author Ruslan Ermilov <ru@nginx.com>
date Wed, 24 Apr 2019 16:38:51 +0300
parents 9e25a5380a21
children bdd4d89370a7
comparison
equal deleted inserted replaced
7502:b7a7c02aea3a 7503:b82162b8496a
103 103
104 return NGX_OK; 104 return NGX_OK;
105 } 105 }
106 106
107 107
108 size_t
109 ngx_stream_complex_value_size(ngx_stream_session_t *s,
110 ngx_stream_complex_value_t *val, size_t default_value)
111 {
112 size_t size;
113 ngx_str_t value;
114
115 if (val == NULL) {
116 return default_value;
117 }
118
119 if (val->lengths == NULL) {
120 return val->u.size;
121 }
122
123 if (ngx_stream_complex_value(s, val, &value) != NGX_OK) {
124 return default_value;
125 }
126
127 size = ngx_parse_size(&value);
128
129 if (size == (size_t) NGX_ERROR) {
130 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
131 "invalid size \"%V\"", &value);
132 return default_value;
133 }
134
135 return size;
136 }
137
138
108 ngx_int_t 139 ngx_int_t
109 ngx_stream_compile_complex_value(ngx_stream_compile_complex_value_t *ccv) 140 ngx_stream_compile_complex_value(ngx_stream_compile_complex_value_t *ccv)
110 { 141 {
111 ngx_str_t *v; 142 ngx_str_t *v;
112 ngx_uint_t i, n, nv, nc; 143 ngx_uint_t i, n, nv, nc;
244 275
245 return NGX_CONF_OK; 276 return NGX_CONF_OK;
246 } 277 }
247 278
248 279
280 char *
281 ngx_stream_set_complex_value_size_slot(ngx_conf_t *cf, ngx_command_t *cmd,
282 void *conf)
283 {
284 char *p = conf;
285
286 char *rv;
287 ngx_stream_complex_value_t *cv;
288
289 rv = ngx_stream_set_complex_value_slot(cf, cmd, conf);
290
291 if (rv != NGX_CONF_OK) {
292 return rv;
293 }
294
295 cv = *(ngx_stream_complex_value_t **) (p + cmd->offset);
296
297 if (cv->lengths) {
298 return NGX_CONF_OK;
299 }
300
301 cv->u.size = ngx_parse_size(&cv->value);
302 if (cv->u.size == (size_t) NGX_ERROR) {
303 return "invalid value";
304 }
305
306 return NGX_CONF_OK;
307 }
308
309
249 ngx_uint_t 310 ngx_uint_t
250 ngx_stream_script_variables_count(ngx_str_t *value) 311 ngx_stream_script_variables_count(ngx_str_t *value)
251 { 312 {
252 ngx_uint_t i, n; 313 ngx_uint_t i, n;
253 314