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