Проверка на допустимый тип вложений в Multipart-FormData#
Допустим, существует поток данных, в виде запросов в виде Multipart/Formdata, и известно, что в некотором поле archive должны передаваться только gzip архивы. Рассмотрим конфигурацию, которая позволяет это делать. Добавим в наш профиль chains еще один сервис:
- id: 5
allowed_queries:
- method: post
optional:
file_upload_limit: off
url: /balancer$
listen:
- port: 20205
chains:
request_chains:
- actions:
- action: MultipartExtract
params:
field_name: archive
actions:
- action: CheckMimeType
params:
file_filter_type: extension
allowable_types: gz
message: $clj_request_body
upstream_group_id: 1
upstream_groups:
- id: 1
servers:
- server: 127.0.0.1:30001
rewrite_uri:
- from: /balancer
to: /test
Обратите внимание:
В секции optional с помощью директивы file_upload_limit и выставления значения off разрешаем передачу muiltipart/formdata, которая по умолчанию не разрешена.
Определяем цепочку действий для запроса, где первым действием идет извлечение поля archive, а вторым действием идет проверка на соответствие реального mime-типа сообщения на application/gzip, при этом данное ограничение задается через зарегистрированное расширение для этого Mime-типа «gz».
Остановим, сконфигурируем и запустим профиль.
Сгенерируем файл, содержащий случайную последовательность байт и запакуем его утилитой gzip:
[sowacfg@741037ad695c chains_examples]$ head -c 1k </dev/urandom >test
[sowacfg@741037ad695c chains_examples]$ gzip test
На выходе получили файл test.gz.
Теперь попробуем отправить данный файл в multipart/formdata:
[sowacfg@741037ad695c chains_examples]$ curl -v http://localhost:20205 -F "archive=@test.gz"
В результате получаем:

Сгенерируем еще один файл со случайным набором байт и попробуем отправить его:
[sowacfg@741037ad695c chains_examples]$ head -c 1k </dev/urand >test2
[sowacfg@741037ad695c chains_examples]$ curl -v http://localhost:20205/balancer -F "archive=@test2"
На выходе получаем:

Немного модифицируем нашу конфигурацию сервиса, добавив еще проверку на допустимый размер вложения перед его проверкой на MIME-тип, конфигурация цепочки приобретет следующий вид:
request_chains:
- actions:
- action: MultipartExtract
params:
field_name: archive
actions:
- action: CheckDataSize
params:
max_allowable_size: 5k
- action: CheckMimeType
params:
file_filter_type: extension
allowable_types: gz
message: $clj_request_body
Здесь задается ограничение, что размер вложений не должен превышать 5 килобайт. Остановим, сконфигурируем и запустим профиль.
Сгенерируем еще один файл размером 10 kb и запакуем его в gz.
[sowacfg@741037ad695c chains_examples]$ head -c 10k </dev/urandom >test2
[sowacfg@741037ad695c chains_examples]$ gzip test2
Отправим форму с файлом на наш сервис:
[sowacfg@741037ad695c chains_examples]curl -v http://localhost:20205/balancer -F "archive=@test2.gz"
В ответ получим:

Если отправим первый файл, то в ответ получим OK:
