How to read variable in C code?

Maxim Dounin mdounin at mdounin.ru
Sat Dec 31 02:42:34 UTC 2016


Hello!

On Fri, Dec 30, 2016 at 02:36:00PM +0100, Witold Filipczyk wrote:

> Hi,
> 
> there is map:
> map $http_host $hosts {
>   hostnames;
>   default 0;
>   .example.com 1;
>   .example.net 1;
>   ...
>   .example.org 1;
> }
> 
> How to read the value of $hosts in C module code?

If you only need a single variable, most effective approach is to 
use indexed variables.  The ngx_http_get_variable_index() function 
is used to obtain an index during configuration parsing / module 
initialization, and ngx_http_get_indexed_variable() to obtain a 
value at runtime.  E.g., memcached module uses this to access 
$memcached_key variable, see here:

http://hg.nginx.org/nginx/file/tip/src/http/modules/ngx_http_memcached_module.c#l716
http://hg.nginx.org/nginx/file/tip/src/http/modules/ngx_http_memcached_module.c#l243

More universal approach is to use complex values.  Complex values 
can contain arbitrary combinations of variables and static 
strings.  During configuration parsing complex values are compiled 
using ngx_http_compile_complex_value() 
(ngx_http_set_complex_value_slot can do it automatically if there 
is a dedicated configuration directive), and then 
ngx_http_complex_value() can be used to obtain a value.  E.g., map 
itself uses complex value to handle the first parameter, 
"$http_host" in your case, see here:

http://hg.nginx.org/nginx/file/tip/src/http/modules/ngx_http_map_module.c#l209
http://hg.nginx.org/nginx/file/tip/src/http/modules/ngx_http_map_module.c#l120

> How to make it right, that's mean do not evaluate it more than once per request?

Map results are automatically cached by nginx, much like all 
variables not explicitly declared as non-cacheable, so you don't 
really need to worry.  On the other hand, usually it's a good idea 
to remember the value obtained in your module data if you are 
going to use it again.

-- 
Maxim Dounin
http://nginx.org/


More information about the nginx-devel mailing list