Mercurial > hg > nginx
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 |