Mercurial > hg > nginx
comparison src/http/ngx_http_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 | 5efc23d83bc2 |
children | 7aa20af4ac00 |
comparison
equal
deleted
inserted
replaced
7502:b7a7c02aea3a | 7503:b82162b8496a |
---|---|
102 | 102 |
103 return NGX_OK; | 103 return NGX_OK; |
104 } | 104 } |
105 | 105 |
106 | 106 |
107 size_t | |
108 ngx_http_complex_value_size(ngx_http_request_t *r, | |
109 ngx_http_complex_value_t *val, size_t default_value) | |
110 { | |
111 size_t size; | |
112 ngx_str_t value; | |
113 | |
114 if (val == NULL) { | |
115 return default_value; | |
116 } | |
117 | |
118 if (val->lengths == NULL) { | |
119 return val->u.size; | |
120 } | |
121 | |
122 if (ngx_http_complex_value(r, val, &value) != NGX_OK) { | |
123 return default_value; | |
124 } | |
125 | |
126 size = ngx_parse_size(&value); | |
127 | |
128 if (size == (size_t) NGX_ERROR) { | |
129 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
130 "invalid size \"%V\"", &value); | |
131 return default_value; | |
132 } | |
133 | |
134 return size; | |
135 } | |
136 | |
137 | |
107 ngx_int_t | 138 ngx_int_t |
108 ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv) | 139 ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv) |
109 { | 140 { |
110 ngx_str_t *v; | 141 ngx_str_t *v; |
111 ngx_uint_t i, n, nv, nc; | 142 ngx_uint_t i, n, nv, nc; |
242 | 273 |
243 return NGX_CONF_OK; | 274 return NGX_CONF_OK; |
244 } | 275 } |
245 | 276 |
246 | 277 |
278 char * | |
279 ngx_http_set_complex_value_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, | |
280 void *conf) | |
281 { | |
282 char *p = conf; | |
283 | |
284 char *rv; | |
285 ngx_http_complex_value_t *cv; | |
286 | |
287 rv = ngx_http_set_complex_value_slot(cf, cmd, conf); | |
288 | |
289 if (rv != NGX_CONF_OK) { | |
290 return rv; | |
291 } | |
292 | |
293 cv = *(ngx_http_complex_value_t **) (p + cmd->offset); | |
294 | |
295 if (cv->lengths) { | |
296 return NGX_CONF_OK; | |
297 } | |
298 | |
299 cv->u.size = ngx_parse_size(&cv->value); | |
300 if (cv->u.size == (size_t) NGX_ERROR) { | |
301 return "invalid value"; | |
302 } | |
303 | |
304 return NGX_CONF_OK; | |
305 } | |
306 | |
307 | |
247 ngx_int_t | 308 ngx_int_t |
248 ngx_http_test_predicates(ngx_http_request_t *r, ngx_array_t *predicates) | 309 ngx_http_test_predicates(ngx_http_request_t *r, ngx_array_t *predicates) |
249 { | 310 { |
250 ngx_str_t val; | 311 ngx_str_t val; |
251 ngx_uint_t i; | 312 ngx_uint_t i; |