Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Maxim Dounin
Hello!

On Thu, Jul 16, 2015 at 03:14:33PM +0300, Daniel Podolsky wrote:

  При правильном выполнении должен проставиться заголовок X-MY-VAR равный
  ==, но по факту ставится число 0.
  Если убрать = из return, то заголовок просто не ставится (видимо, пустая
  переменная).
 в перле + - не оператор конкатенации строк, извините.

Поработаю К.О.:
Это, в частности, означает, что результат 0 - правильный, и всё 
работает ровно так, как написано.

 ну и мне кажется, что $outer_variable выполнится раньше, чем код location

Нет.  Код, который вычисляет значение перловой переменной, 
выполняется в момент обращения к этой переменной.  Т.е., в случае 
add_header он выполнится только тогда, когда будет делаться 
add_header - уже в процессе возврата ответа.

Отмечу также, что код perl_set выполняется только один раз за 
запрос, и результат выполнения - кешируется до окончания запроса.  
Соответственно, ранее звучавшая в этом треде рекомендация 
сохранять значение с помощью set - избыточна.

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

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Michael Kechinov
Всем спасибо. Победил:
https://gist.github.com/noff/865d3d043964d099b927
Осталось выяснить, насколько это сильно влияет на скорость обработки
запросов (если добавит больше 5ms, то плохо).

2015-07-16 21:32 GMT+03:00 Maxim Dounin mdou...@mdounin.ru:

 Hello!

 On Thu, Jul 16, 2015 at 09:10:41PM +0300, Michael Kechinov wrote:

 [...]

  При выполнении POST-запросов $r-request_body всегда пустое. Почему?

 Потому что для чтения тела запроса надо вызывать метод
 $r-has_request_body(), см. пример в документации тут:

 http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods

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

 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru




-- 
*Michael Kechinov http://linkedin.com/in/mkechinov* | s...@mkechinov.ru |
+7 950 0099233
Startups development studio: mkechinov.ru | en http://mkechinov.com
Personalization for e-commerce: rees46.com
HackDay: hackday.ru
Twitter-wall: twijector.com
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Daniel Podolsky
2015-07-16 0:51 GMT+03:00 Michael Kechinov kechin...@gmail.com:
 Внутри location делаю вставку perl, в которой что-то рассчитывается и
 результат нужно передать в переменную внутрь location. Как это можно
 сделать?
http://nginx.org/ru/docs/http/ngx_http_perl_module.html#perl_set

английский вариант этой доки, надо сказать, более внятный

так вот, perl_set позволяет создать квазипеременную, при упоминании
которой в конфиге будет вызываться ваш перловый код. при каждом
упоминании.

соответственно, если вызвать код надо один раз на запрос - используйте
set в сочетании с perl_set
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Michael Kechinov
Английская дока, насколько вижу, полностью соответствует русской.

Я сделал так, но не работает:

http {
 perl_set $outer_variable '
sub {
my $r = shift;
return = + $r-variable(inner_variable)  + =;
}
';

location / {

perl '
sub {
my $r = shift;
$r-variable(inner_variable, );
}
';
 add_header X-MY-VAR $outer_variable;

}

}

При правильном выполнении должен проставиться заголовок X-MY-VAR равный
==, но по факту ставится число 0.
Если убрать = из return, то заголовок просто не ставится (видимо, пустая
переменная).



2015-07-16 11:12 GMT+03:00 Daniel Podolsky onoko...@gmail.com:

 2015-07-16 0:51 GMT+03:00 Michael Kechinov kechin...@gmail.com:
  Внутри location делаю вставку perl, в которой что-то рассчитывается и
  результат нужно передать в переменную внутрь location. Как это можно
  сделать?
 http://nginx.org/ru/docs/http/ngx_http_perl_module.html#perl_set

 английский вариант этой доки, надо сказать, более внятный

 так вот, perl_set позволяет создать квазипеременную, при упоминании
 которой в конфиге будет вызываться ваш перловый код. при каждом
 упоминании.

 соответственно, если вызвать код надо один раз на запрос - используйте
 set в сочетании с perl_set
 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru




-- 
*Michael Kechinov http://linkedin.com/in/mkechinov* | s...@mkechinov.ru |
+7 950 0099233
Startups development studio: mkechinov.ru | en http://mkechinov.com
Personalization for e-commerce: rees46.com
HackDay: hackday.ru
Twitter-wall: twijector.com
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Daniel Podolsky
 При правильном выполнении должен проставиться заголовок X-MY-VAR равный
 ==, но по факту ставится число 0.
 Если убрать = из return, то заголовок просто не ставится (видимо, пустая
 переменная).
в перле + - не оператор конкатенации строк, извините.

ну и мне кажется, что $outer_variable выполнится раньше, чем код location
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Michael Kechinov
Видимо да.

Вот и ищу способ, как же сделать так, чтобы из location можно было
определить переменную, которая будет использована в http. Потому что
request_body доступен только в location, а map, который нужно сделать на
основании данных в request_body, доступен только в http.

2015-07-16 15:14 GMT+03:00 Daniel Podolsky onoko...@gmail.com:

  При правильном выполнении должен проставиться заголовок X-MY-VAR равный
  ==, но по факту ставится число 0.
  Если убрать = из return, то заголовок просто не ставится (видимо,
 пустая
  переменная).
 в перле + - не оператор конкатенации строк, извините.

 ну и мне кажется, что $outer_variable выполнится раньше, чем код location
 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru




-- 
*Michael Kechinov http://linkedin.com/in/mkechinov* | s...@mkechinov.ru |
+7 950 0099233
Startups development studio: mkechinov.ru | en http://mkechinov.com
Personalization for e-commerce: rees46.com
HackDay: hackday.ru
Twitter-wall: twijector.com
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Установить переменную с помощью perl внутри location

2015-07-16 Пенетрантность Maxim Dounin
Hello!

On Thu, Jul 16, 2015 at 09:10:41PM +0300, Michael Kechinov wrote:

[...]

 При выполнении POST-запросов $r-request_body всегда пустое. Почему?

Потому что для чтения тела запроса надо вызывать метод 
$r-has_request_body(), см. пример в документации тут:

http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods

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

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru