среда, 17 мая 2017 г.

Асинхронная обработка тела клиентского запроса в nginx-haskell-module

Только что добавил данную функциональность в модуль. Вот ссылка на соответствующую главу в документации. В modular подходе нужны экспортеры ngxExportAsyncOnReqBody, которые доступны в новой версии 0.3.0.0 пакета ngx-export. Протестировать хэндлеры reqBody, reqHead и reqFld из примера в test/tsung/nginx-async.cfg можно с помощью curl. Например,
curl --data-binary @path/to/some/file 'http://localhost:8010/rb?a=10'
выведет файл, посланный в POST запросе, его первые 10 строк, а также, скорее всего неуспешный, результат поиска значения поля 10 из содержимого посланного файла, которое хэндлер reqFld попытается проинтерпретировать как форму HTML. Для больших файлов возможны два варианта отказа: в случае очень большого файла nginx скажет, что не смог принять его содержимое ввиду большого размера — в этом случае можно увеличить значение максимального размера тела запроса, равное по умолчанию 1 Мб, стандартной директивой client_max_body_size. Файл поменьше может быть сохранен во временный файл, и модуль сообщит об этом в лог на уровне alert — в этом случае можно подкрутить значение стандартной директивы client_body_buffer_size, равное по умолчанию 8 или 16 Кб. А теперь давайте пошлем форму.
curl --data 'a=23&b=14&c=6' 'http://localhost:8010/rb?a=b'
>>> BODY

a=23&b=14&c=6
>>> BODY HEAD b


>>> FIELD b

14
Тело выведено верно. Значение b аргумента запроса a не соответствует числу, поэтому выводится 0 первых строк тела запроса — здесь все хорошо. Ну и значение поля b из тела-формы равно 14 — и здесь все верно. И напоследок ссылка на презентацию модуля, которую я представлял на Spb Fprog Meetup 27 апреля этого года. В ней, естественно, еще нет упоминаний о хэндлерах тела запроса.