Создание файла с правилами#

В разделе приводится описание параметров для создания файла с правилами, описывающего, каким образом заполнять файл шаблона (возможные значения файла шаблона указаны в разделе «Настройка постобработчика», в описании параметра pattern_file).

rules - параметры#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

condition

Обязательный (если default не задан или default: false)

Последовательность условий для проверки

Параметры, описанные в разделе «rules - condition»

—

status

Опциональный

Возвращаемый код состояния http или переменная nginx, которая его содержит

Текстовое значение

—

priority

Опциональный

Приоритет условия. В случае, если совпадают два условия (condition) с одинаковым количеством анализируемых сообщений, то выбирается условие с большим приоритетом. Обязательно требуется указание приоритета для условий с одинаковым количеством анализируемых сообщений

Текстовое значение

Условия с наибольшим количеством переменных

default

Опциональный

Состояние, которое будет выполняться, если ни одно из условий (condition) не выполнено. Наличие одного дефолтного условия обязательно в конфигурации

true, false

—

responsePattern

Обязательный (если redirectUrl не задан)

Шаблон ответа (или файл с шаблоном ответа, если указан путь к файлу «file: //…»)

Текстовое значение

—

redirectUrl

Обязательный (если responsePattern не задан)

URL перенаправления. Допускается использование переменных Nginx

Текстовое значение

—

replacements

Опциональный

Последовательность замен подсказок в шаблоне

Параметры, описанные в разделе «rules - replacements»

—

headers

Опциональный

Последовательность имя/значение, которая будет добавлена к заголовкам ответа

Параметры, описанные в разделе «rules - headers»

—

skipOnDefault (deprecated)

Опциональный

Флаг, если необходимо «пропустить» правило «по умолчанию»

true, false

—

rules - condition#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

var

Обязательный

Анализируемая переменная. Примеры: $validation_error_code, $mq_status_code

Текстовое значение

—

operator

Обязательный

Операнд сравнения. Для строк: равенство, неравенство или регулярное выражение. Для чисел: стандартные операторы сравнения

= — посимвольное равенство; != — посимвольное неравенство; <= — меньше или равно (только для чисел); >= — больше или равно (только для чисел); > — больше (только для чисел); < — меньше (только для чисел); in — вхождение в перечисление; not_in — отсутствие вхождения в перечисление; ~ — регулярное выражение с учетом регистра; ~* — регулярное выражение без учета регистра; !~ — негативное регулярное выражение с учетом регистра; !~* — негативное регулярное выражение без учета регистра; ip_range — диапазон ip адресов; !ip_range — отсутствие в диапазоне ip адресов; dn_mask — маска доменного имени; !dn_mask — несоответствие маске доменного имени

—

val

Обязательный

Ожидаемое значение анализируемой переменной. Для оператора in элементы задаются через запятую

Текстовое значение

—

rules - replacements#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

pattern

Обязательный

Имя любой подсказки из шаблона

Текстовое значение

—

val

Обязательный

Значение подсказки

Текстовое значение

—

rules - headers#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

name

Обязательный

Имя заголовка

Текстовое значение

—

value

Обязательный

Значение заголовка (может содержать переменные)

Текстовое значение

—

Пример:

rules:
 - condition:
    - var: $validation_error_code
      operator: "="
      val:  1
   replacements:
    - pattern: errorCode
      val:     101
    - pattern: errorMessage
      val:     "Could't load schema from file"
   priority: 1
   status: 500
 - condition:
    - var: $validation_error_code
      operator: "="
      val:  2
    - var: $mq_status_code
      operator: "in"
      val:  2131,2141,2151
   replacements:
    - pattern: errorCode
      val:     102
    - pattern: errorMessage
      val:     "Could't connect to IBMMQ"
   priority: 2
   status: 500
 - default: True
   replacements:
    - pattern: errorCode
      val:     100
    - pattern: errorMessage
      val:     "Unknown error"
   status: 503

Пример файла с правилами для версии дистрибутива 2.1 и выше, в котором присутствует поддержка chains:

rules:
  - condition:
      - var: clj_validation_error_code
        operator: ">"
        val: 0
      - var: clj_processing_phase
        operator: "="
        val: "REQUEST"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-41"
      - pattern: errorText_variable
        val: "Ошибка валидации запроса"
    status: 500
    priority: 49
  - condition:
      - var: clj_validation_error_code
        operator: ">"
        val: 0
      - var: clj_processing_phase
        operator: "="
        val: "RESPONSE"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-42"
      - pattern: errorText_variable
        val: "Ошибка валидации ответа"
    priority: 50
    status: 500
  - condition:
     - var: completion_code
       operator: ">"
       val: 0
    replacements:
     - pattern: errorCode_variable
       val: "CODE-61"
     - pattern: errorText_variable
       val: "Системная ошибка при работе с менеджером очередей"
  - condition:
      - var: msc_disruptive
        operator: ">"
        val: 0
      - var: msc_tags
        operator: "~"
        val: "SQLi"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-90"
      - pattern: errorText_variable
        val: "Ошибка наличия SQL-Injection"
    priority: 51
  - condition:
      - var: status
        operator: "="
        val: 404
    replacements:
      - pattern: errorCode_variable
        val: "CODE-101"
      - pattern: errorText_variable
        val: "Не найден маршрут"
  - condition:
      - var: upstream_response_state
        operator: "~"
        val: "(4[0-9]{2}|50[03])"
      - var: status
        operator: ">="
        val: 0
    replacements:
      - pattern: errorCode_variable
        val: "CODE-154"
      - pattern: errorText_variable
        val: "Некорректный ответ от внешнего сервиса"
    status: $upstream_response_state
    priority: 154
  - condition:
      - var: upstream_status
        operator: "~"
        val: 502
      - var: upstream_broken_connection
        operator: "="
        val: 1
    replacements:
      - pattern: errorCode_variable
        val: "CODE-152"
      - pattern: errorText_variable
        val: "Обрыв HTTP сессии внешним сервисом до таймаута шлюза"
    priority: 152
    status: 500
  - condition:
      - var: upstream_status
        operator: "~"
        val: 504
    replacements:
      - pattern: errorCode_variable
        val: "CODE-153"
      - pattern: errorText_variable
        val: "Не получили ответа от внешнего сервиса за указанный таймаут"
    status: 500
  - condition:
      - var: clj_validation_error_code
        operator: "="
        val: 3
      - var: clj_processing_phase
        operator: "="
        val: "RESPONSE"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-157"
      - pattern: errorText_variable
        val: "Ответ не является JSON"
    priority: 57
    status: 500
  - condition:
      - var: clj_validation_error_code
        operator: "="
        val: 3
      - var: clj_processing_phase
        operator: "="
        val: "REQUEST"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-158"
      - pattern: errorText_variable
        val: "Запрос не является JSON"
    priority: 58
    status: 500
  - condition:
      - var: clj_validation_error_text
        operator: "!="
        val: ""
      - var: clj_trimmed_body
        operator: "!="
        val: ""
      - var: clj_processing_phase
        operator: "="
        val: "RESPONSE"
    replacements:
      - pattern: value
        val: $clj_trimmed_body
# С помощью этого правила выставляется тело ответа, из которого были удалены дополнительные атрибуты
    responsePattern: "{value}"
    priority: 55
    status: $upstream_status
  - condition:
      - var: clj_processing_phase
        operator: "!="
        val: ""
      - var: clj_response_chain_result
        operator: "in"
        val: "ERROR,DENY"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-100"
      - pattern: errorText_variable
        val: "Неизвестная run-time ошибка"
    priority: 2
    status: 500
  - condition:
      - var: clj_processing_phase
        operator: "!="
        val: ""
      - var: clj_request_chain_result
        operator: "in"
        val: "ERROR,DENY"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-100"
      - pattern: errorText_variable
        val: "Неизвестная run-time ошибка"
    priority: 1
    status: 500
  - condition:
      - var: status
        operator: ">="
        val: "400"
    replacements:
      - pattern: errorCode_variable
        val: "CODE-100"
      - pattern: errorText_variable
        val: "Неизвестная run-time ошибка"
    priority: 0
    status: 500
  # TODO: CODE1000
  - default: True
    replacements:
      - pattern: errorCode_variable
        val: "CODE-100"
      - pattern: errorText_variable
        val: "Неизвестная run-time ошибка"
    status: 500
skipOnDefault: True