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