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;