Re: r->request body->temp file и внешнее П.О.(API, Си)

Maxim Dounin mdounin на mdounin.ru
Пн Янв 18 10:21:25 UTC 2016


Hello!

On Mon, Jan 18, 2016 at 03:35:35AM -0500, rba wrote:

> Что нужно вызвать/сконфигурировать в модуле на Си, чтобы увидеть файл
> сторонним П.О. 
> !!без!! выставления принудительного client_body_in_file_only в конфиге? 
> 
> Данные не буферах! 
> r->request_body->temp_file OK 
> В самописном модуле без проблем читаю приходящие данные из request_body
> через ngx_read_file. 
> Читаю неспешно длительное время с задержкой через таймер. 
> В логах тоже всё ок, типа...hashed path: /client_body_temp_path/0000000001 и
> т.п. 
> 
> ls -l /client_body_temp_path - пустая, но время изменения директории
> меняется 
> cat /client_body_temp_path/0000000001 тоже говорит No such file or directory
> 
> Разумеется это до финализации запроса. 
> 
> если выставить в конфиге "client_body_in_file_only on" то файл виден, но
> т.к. бывают запросы умещающиеся в буфера file_only - не вариант.

Чтобы тело запроса всегда писалось в файл, надо перед чтением тела 
выставить флаг:

        r->request_body_in_file_only = 1;

Кроме того, чтобы временный файл не был удалён сразу после 
создания, надо выставить флаг:

        r->request_body_in_persistent_file = 1;

Если нужно, чтобы файл удалили после завершения обработки запроса, 
то также следует устновить флаг:

        r->request_body_in_clean_file = 1;

Кроме того, стоит понизить уровень логгирования при создании 
временных файлов:

        r->request_body_file_log_level = NGX_LOG_NOTICE;

Пример можно посмотреть в реализации директивы 
client_body_in_file_only (в функции 
ngx_http_update_location_config(), 
src/http/ngx_http_core_module.c), или в модуле DAV 
(src/http/modules/ngx_http_dav_module.c).

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



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