Re: Модули: когда у ngx_http_variable_t срабатывает get_handler и set_handler?

Maxim Dounin mdounin at mdounin.ru
Thu Nov 14 18:49:22 UTC 2013


Hello!

On Thu, Nov 14, 2013 at 09:15:46PM +0400, Igor 'Lo' (И.L.) wrote:

> Есть filter module, в ходе работы которого задается одна переменная
> (ngx_http_variable_t).
> 
> Причем у переменной определен только get_handler с сигнатурой
> that_variable_code(ngx_http_request_t *r,  ngx_http_variable_value_t *v,
> uintptr_t data).
> 
> Вопрос: что такое set_handler у переменных? Почему, хотя он не задан, в
> get'е получается выполнить процессинг данных ngx_http_request_t и присвоить
> значение?

Обработчик set_handler - это такая функция, которая будет вызвана 
кодом

    set $your_variables "some value";

E.g., при выполнении кода rewrite-модуля "set $args 'foo'" - в 
r->args записывается соответствующая строка.

> Второй вопрос: допустим, я хочу добавить еще одну переменную. Но при этом
> получение значений для обеих переменных выполняется один раз (тяжелая
> инициализация..). Куда можно запихнуть в ngx_http_request_t свое значение
> так, чтобы его смогли забрать оба get_handler'а? (учитывая то, что
> http_request_t вроде как может использоваться для нескольких запросов)

В контекст модуля.  Смотреть ngx_http_set_ctx(), 
ngx_http_get_module_ctx().

> Третий вопрос: каким образом можно задать значение строковой переменной,
> находясь в header filter и зная имя переменной (строку)?

Лучше всего - не пытаться ставить чужие переменные, а 
предоставлять свои с нужными значениями.

Но если очень хочется, то пример можно посмотреть в том же модуле 
rewrite (директива set) и/или в auth request.  Общий смысл в том, 
что нужно знать индекс переменной (получить его на этапе 
конфигурации), и записать нужное значение в r->variables[index], а 
если у директивы есть set_handler - то позвать его.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



Подробная информация о списке рассылки nginx-ru