284
285
lowcase, lowcase);
289
#ifndef NGX_HTTP_LUA_NO_FFI_API
291
ngx_http_lua_ffi_var_get(ngx_http_request_t *r, u_char *name_data,
292
size_t name_len, u_char *lowcase_buf, int capture_id, u_char **value,
293
size_t *value_len, char **err)
297
ngx_http_variable_value_t *vv;
306
*err = "no request object found";
310
if ((r)->connection->fd == -1) {
311
*err = "API disabled in the current context";
316
if (name_data == 0) {
317
if (capture_id <= 0) {
321
/* it is a regex capturing variable */
323
n = (ngx_uint_t) capture_id * 2;
325
dd("n = %d, ncaptures = %d", (int) n, (int) r->ncaptures);
327
if (r->captures == NULL
328
|| r->captures_data == NULL
329
|| n >= r->ncaptures)
334
/* n >= 0 && n < r->ncaptures */
337
p = r->captures_data;
340
*value_len = (size_t) (cap[n + 1] - cap[n]);
346
hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);
348
name.data = lowcase_buf;
351
dd("variable name: %.*s", (int) name_len, lowcase_buf);
353
vv = ngx_http_get_variable(r, &name, hash);
354
if (vv == NULL || vv->not_found) {
359
*value_len = vv->len;
365
ngx_http_lua_ffi_var_set(ngx_http_request_t *r, u_char *name_data,
366
size_t name_len, u_char *lowcase_buf, u_char *value, size_t value_len,
367
u_char *errbuf, size_t errlen)
371
ngx_http_variable_t *v;
372
ngx_http_variable_value_t *vv;
373
ngx_http_core_main_conf_t *cmcf;
376
ngx_snprintf(errbuf, errlen, "no request object found");
380
if ((r)->connection->fd == -1) {
381
ngx_snprintf(errbuf, errlen, "API disabled in the current context");
385
hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);
387
dd("variable name: %.*s", (int) name_len, lowcase_buf);
389
/* we fetch the variable itself */
391
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
393
v = ngx_hash_find(&cmcf->variables_hash, hash, lowcase_buf, name_len);
396
if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {
397
dd("variable not changeable");
398
ngx_snprintf(errbuf, errlen, "variable \"%*s\" not changeable",
399
name_len, lowcase_buf);
403
if (v->set_handler) {
405
dd("set variables with set_handler");
407
if (value != NULL && value_len) {
408
vv = ngx_pnalloc(r->pool, sizeof(ngx_http_variable_value_t)
414
p = (u_char *) vv + sizeof(ngx_http_variable_value_t);
415
ngx_memcpy(p, value, value_len);
419
vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));
428
vv->no_cacheable = 0;
435
vv->no_cacheable = 0;
441
v->set_handler(r, vv, v->data);
445
if (v->flags & NGX_HTTP_VAR_INDEXED) {
446
vv = &r->variables[v->index];
448
dd("set indexed variable");
453
vv->no_cacheable = 0;
459
p = ngx_palloc(r->pool, value_len);
463
ngx_memcpy(p, value, value_len);
468
vv->no_cacheable = 0;
477
ngx_snprintf(errbuf, errlen, "variable \"%*s\" cannot be assigned "
478
"a value", name_len, lowcase_buf);
482
/* variable not found */
484
ngx_snprintf(errbuf, errlen, "variable \"%*s\" not found for writing; "
485
"maybe it is a built-in variable that is not changeable "
486
"or you forgot to use \"set $%*s '';\" "
487
"in the config file to define it first",
488
name_len, lowcase_buf, name_len, lowcase_buf);
493
ngx_snprintf(errbuf, errlen, "no memory");
496
#endif /* NGX_HTTP_LUA_NO_FFI_API */
287
499
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */