HTTP провайдер

HTTP провайдер это источник тестовых данных, который создает объекты Payload

Провайдер HTTP является источником тестовых данных: он создает объект Payload.

Существует общее правило для любого (встроенного) провайдера: данные, поставляемые провайдером патронов, - это записи, которые будут переданы через установленное соединение с внешним хостом (задается в конфигурации pandora через опцию pool.gun.target). Таким образом, вы не можете определить в файле payload, на какой физический хост будут отправлены ваши Payload.

Тестовые данные

http/json

формат jsonline, 1 строка - 1 патрон в json-кодировке.

Обратите внимание на специальный заголовок Host, определенный вне словаря Headers.

Host внутри секции Headers будет молча проигнорирован.

Пример содержимого:

{"tag": "tag1", "uri": "/", "method": "GET", "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent": "Pandora"}, "host": "example.com"}

Пример конфига:

pools:
  - ammo:
      type: http/json                # ammo format
      file: ./ammofile               # ammo file path

raw (request-style)

Формат Raw HTTP-запроса. Если вы любите использовать telnet, обстреливающий HTTP-запросы, вам понравится это. Также известен как request-style от Phantom.

Файл содержит HTTP-запросы с префиксом размера. Каждый запрос имеет строку заголовка (разделенную \n), которая состоит из из двух полей, разделенных пробелом: размер патрона и тег. Размер боеприпаса указывается в байтах (целое число, включая специальные символы, такие как CR, LF). Тег - это строка. Об этом формате (с подробными инструкциями) вы можете прочитать на сайте Документация Яндекс.Танка

Пример аммофайла:

73 good
GET / HTTP/1.0
Host: xxx.tanks.example.com
User-Agent: xxx (shell 1)

77 bad
GET /abra HTTP/1.0
Host: xxx.tanks.example.com
User-Agent: xxx (shell 1)

78 unknown
GET /ab ra HTTP/1.0
Host: xxx.tanks.example.com
User-Agent: xxx (shell 1)

Пример конфига:

pools:
  - ammo:
      type: raw                      # ammo format
      file: ./ammofile               # ammo file path

Вы можете определить общие заголовки с помощью специальной опции конфигурации headers. Заголовки в ammo-файле имеют приоритет. Формат: список строк.

Пример:

pools:
  - ammo:
      type: raw                      # ammo format
      file: ./ammofile               # ammo file path
      headers:
        - "[Host: yourhost.tld]"
        - "[User-Agent: some user agent]"

uri-style

Список URIs и заголовков

Пример содержимого:

[Connection: close]
[Host: your.host.tld]
[Cookie: None]
/?drg tag1
/
/buy tag2
[Cookie: test]
/buy/?rt=0&station_to=7&station_from=9

Пример конфига:

pools:
  - ammo:
      type: uri                      # ammo format
      file: ./ammofile               # ammo file path

Вы можете определить общие заголовки с помощью специальной опции конфигурации headers. Заголовки в ammo-файле имеют приоритет. Формат: список строк.

Пример:

pools:
  - ammo:
      type: uri                      # ammo format
      file: ./ammofile               # ammo file path
      headers:
        - "[Host: yourhost.tld]"
        - "[User-Agent: some user agent]"

Возможности

Фильтры

Каждый провайдер http позволяет выбрать конкретный ammo для вашего теста из файла ammo с настройкой chosencases:

pools:
  - ammo:
      type: uri                        # ammo format
      chosencases: [ "tag1", "tag2" ]  # use only "tag1" and "tag2" ammo for this test
      file: ./ammofile                 # ammo file path

Теги определяются в файлах патронов, как показано ниже:

http/json:

{"tag": "tag1", "uri": "/",

raw (request-style):

73 tag1
GET / HTTP/1.0

uri-style:

/?drg tag1
/
/buy tag2

HTTP middlewares

Провайдеры HTTP имеют возможность модифицировать HTTP-запрос непосредственно перед выполнением. Для этого используются Middlewares. Пример Middleware, устанавливающего заголовок Date в запросе.

pools:
  - ammo:
      type: uri
      ...
      middlewares:
        - type: header/date
          location: EST
          headerName: Date

Список встроенных Middlewares HTTP:

  • header/date

Вы можете создавать собственные промежуточные модули. Но для этого вам нужно зарегистрировать их в custom pandora

import (
    "github.com/yandex/pandora/components/providers/http/middleware"
    "github.com/yandex/pandora/components/providers/http/middleware/headerdate"
    httpRegister "github.com/yandex/pandora/components/providers/http/register"
)

httpRegister.HTTPMW("header/date", func (cfg headerdate.Config) (middleware.Middleware, error) {
    return headerdate.NewMiddleware(cfg)
})

Подробнее о том, как писать пользовательские пандоры, читайте в Custom.

Предварительная загрузка HTTP-патронов

Архитектура Pandora рассчитана на высокую производительность. Для достижения высокой производительности Pandora подготавливает payload для каждого экземпляра.

Если у вас большие запросы и большое количество экземпляров, Pandora начинает использовать много памяти.

На этот случай у HTTP-провайдеров есть флаг preload. Если он установлен в true, провайдер загрузит файл патронов в память и использовать тело запроса из памяти.

Пример:

pools:
  - ammo:
      type: ...
      ...
      preload: true