Перейти к содержимому

HTTP ​

Экран HTTP — одновременно инструмент разбора запросов и инструмент нагрузки:

  • отправить один запрос и увидеть статус, затраченное время, заголовки и тело;
  • аутентифицироваться по Basic, Bearer-токеном или по Digest;
  • хранить cookie, которые выставляет сервер, как это делает браузер;
  • отправлять один и тот же запрос много раз одновременно (блок Нагрузочный поток) и читать пропускную способность и перцентили задержки.

Отправка запроса ​

  1. Откройте HTTP.
  2. Выберите метод и введите URL, например http://127.0.0.1:8080/health.
  3. Добавьте в блок Заголовки нужные серверу заголовки; кнопка + заголовок добавляет строку, ✕ удаляет. Строка без имени не отправляется.
  4. Для метода, отличного от GET и HEAD, напишите тело запроса в поле Тело. Текст остаётся в поле, пока вы переключаетесь на GET или HEAD, и возвращается вместе с другим методом, но в это время не отправляется.
  5. Нажмите Отправить.

Строка под кнопками сразу выносит вердикт — статус, время и размер либо причину, по которой ответа нет, — а остальное показывает панель Ответ. Запрос (метод, URL, заголовки, тело, тайм-аут и параметр Хранить cookie) сохраняется при переключении экранов и при перезапуске приложения; учётные данные — нет.

КлавишаГдеЧто делает
EnterURL, заголовок, учётные данные, тайм-аутотправляет
Ctrl+Enterлюбое поле запроса, включая телоотправляет
Ctrl+Sлюбое поле запросасохраняет как сигнал (ниже)

Поля запроса ​

ПолеЧто этоПо умолчанию
МетодGET, POST, PUT, PATCH, DELETE, HEAD или OPTIONSGET
URLURL с http:// или https://http://127.0.0.1:8080/
ЗаголовкиПары «имя — значение», отправляются как записаны. Если вы не задали свой User-Agent, Signal Lab отправляет SignalLab/0.1.Accept: application/json
АутентификацияКак запрос аутентифицируется (ниже)Нет
Хранить cookieОтправлять обратно cookie, которые выставляют серверы (ниже)включено
ТелоОтправляется ровно так, как написано; Content-Type не добавляется, поэтому добавьте подходящий заголовок. Пустое тело не отправляется. Для GET и HEAD поле не показывается, и тогда запрос вообще не несёт тела — ни при отправке, ни в сохранённом сигнале, ни в В эксперимент — даже если вы вводили тело под другим методом.пусто
Таймаут (мс)Сколько может занять весь обмен, включая ответ и тело10 000

Аутентификация ​

АутентификацияПоляЧто отправляется
Нет—заголовок Authorization не отправляется
BasicИмя пользователя, ПарольAuthorization: Basic …, имя и пароль в base64, уже с первым запросом
Bearer-токенТокенAuthorization: Bearer <token>
DigestИмя пользователя, Парольпоначалу ничего; ответ на вызов сервера (ниже)

При переключении между Basic и Digest имя и пароль сохраняются.

Digest ​

С Digest Signal Lab отправляет запрос без учётных данных. Когда сервер отвечает 401 с вызовом Digest, Signal Lab вычисляет ответ по вызову и вашему паролю и отправляет запрос снова. Вы видите ответ на этот второй запрос с пометкой Digest: вызов принят, а задержка включает оба обмена — столько ждёт клиент.

  • Алгоритмы: MD5 и SHA-256 и их варианты -sess. Если сервер предлагает оба, используется SHA-256.
  • Качество защиты: auth и auth-int, а также более старый ответ без qop.
  • Когда сервер сообщает, что nonce истёк (stale), или снова запрашивает ответ с новым nonce, на запрос отвечают заново — ещё до 3 раз. Когда он отвергает ответ на последний выданный nonce, 401 остаётся в силе: имя или пароль неверны.
  • Перенаправления Signal Lab выполняет сам, поэтому ответ получает именно тот URL, который его запросил. На вызов с другого источника (origin) он не отвечает: учётные данные, введённые для одного хоста, не уходят на другой. Переход с http:// на https:// на том же хосте и портах по умолчанию считается тем же хостом.

Когда на вызов нельзя ответить, 401 остаётся в силе, а панель объясняет причину:

СообщениеЧто значит
Сервер ответил 401, но Digest не запросилСерверу нужна другая схема; попробуйте Basic или Bearer.
Сервер запросил Digest с …Алгоритм, который Signal Lab не поддерживает; он поддерживает MD5 и SHA-256.
Сервер запросил Digest без realm или nonceВызов сервера неполный.
Запрос перенаправлен на …, и там запросили DigestПеренаправление привело на другой источник, чей вызов не принимается.

Куда попадают учётные данные ​

Учётные данные попадают только в заголовок Authorization запроса в момент отправки. Инспектор, консоль и отчёты экспериментов никогда не показывают этот заголовок. На этом экране они хранятся только в памяти и пропадают после перезапуска — если только запрос не связан с сохранённым сигналом: он возвращает их.

WARNING

Запрос, сохранённый как сигнал, хранит свои учётные данные в файле библиотеки signals.json открытым текстом. В эксперименте вместо этого запишите пароль как {{secret.NAME}}; см. Данные и шаблоны.

Cookie ​

Пока включён параметр Хранить cookie, то, что сервер выставляет через Set-Cookie, сохраняется в банке cookie экрана и отправляется обратно с последующими запросами к этому серверу по правилам браузера (домен, путь, Secure, срок действия). Банку используют запросы этого экрана, его нагрузочный поток и HTTP-сигналы, которые вы отправляете из библиотеки. Выключите параметр, чтобы отправлять запросы без cookie и ничего не хранить.

Панель cookie под запросом и ответом перечисляет, что хранится в банке: столбцы Имя, Значение, Домен и путь (домен, начинающийся с ., охватывает и свои поддомены), Истекает (у cookie без срока действия там написано с сеансом) и Флаги (Secure, HttpOnly, SameSite). Cookie с истёкшим сроком не показываются. Кнопка Очистить очищает банку.

Банка живёт, пока работает приложение: после перезапуска она пуста. На сервере одна банка на все страницы, которые к нему вошли. У запуска эксперимента своя банка (см. Эксперименты), а signallab send http банку не использует.

Ответ ​

ЧастьЧто это
СтатусКод статуса и его пояснение; ERR, если ответа не было
ЗадержкаОт отправки до последнего байта тела, в миллисекундах
РазмерРазмер тела
Заголовки ответаЩёлкните строку с их числом, чтобы показать или скрыть их
ТелоФорматируется, если это JSON; переключают Как есть и Форматировать JSON. Показывается до 256 КиБ, затем … (truncated).

Когда ответа нет, панель объясняет причину теми же словами, что и везде в Signal Lab: отказано в подключении, нет ответа за отведённое время, имя не разрешается, проблема с сертификатом и так далее. Технические подробности от системы свёрнуты под ней.

Перенаправления ​

Перенаправления (301, 302, 303, 307, 308) выполняются, до 10 раз; показан последний ответ. После 301, 302 и 303 запрос продолжается как GET без тела (HEAD остаётся HEAD); после 307 и 308 — как был. Authorization и cookie, заданные для одного хоста, на другой не передаются.

Защищённые соединения ​

Сертификат сервера https:// проверяется по сертификатам, которым доверяет эта система. Самоподписанный или просроченный сертификат отклоняется с сообщением «Не удалось установить защищённое соединение с …»; настройки, позволяющей пропустить проверку, нет. Чтобы протестировать сервер со своим сертификатом, добавьте его в доверенные сертификаты системы.

Нагрузочный поток ​

Блок Нагрузочный поток много раз отправляет запрос с экрана — с его аутентификацией и, пока включён параметр Хранить cookie, с банкой cookie — и измеряет его.

  1. Задайте Параллельность, Всего, Длительность, с и Темп, запр/с.
  2. Нажмите Запустить нагрузку. Нагрузочный поток — это задача: его завершает Остановить нагрузку или остановка из полосы задач.
ПолеЧто этоПо умолчанию
ПараллельностьСколько запросов «в полёте» одновременно, 1–51220
ВсегоСколько запросов отправить; 0 — отправлять, пока не истечёт длительность500
Длительность, сСколько секунд работать; 0 — остановиться, когда отправлено заданное число0
Темп, запр/сСколько запросов стартует в секунду, 0,1–100 000; 0 — так быстро, как справляются воркеры0

Если и Всего, и Длительность, с равны 0, нагрузочный поток работает, пока вы его не остановите.

Отправлять можно двумя способами:

  • Темп, запр/с 0. Каждый воркер отправляет снова, как только получает ответ. Так выясняется, сколько выдерживает сервер, но медленный сервер замедляет и сам поток.
  • Заданный темп. Запросы стартуют по фиксированному расписанию — при 10 в секунду по одному каждые 100 мс от начала, — как бы медленно ни приходили ответы. Запрос, чей момент наступил, когда все воркеры заняты, ждёт освобождения не дольше 50 мс; после этого он пропускается и учитывается как Пропущено, но никогда не отправляется с опозданием. Пропущенные запросы означают, что параллельность слишком мала для этого темпа или сервер медленнее, чем нужно для темпа.
ЧислоЧто это
ОтправленоЗапросы, на которые пришёл ответ или которые завершились ошибкой
УспешноОтвет со статусом 2xx
ОшибокНет ответа или любой статус вне 200–299
ПропущеноПропущены, как описано выше (только при заданном темпе)
Запр/сЗапросов в секунду за последнюю десятую долю секунды; когда поток закончился — за весь поток. При заданном темпе подпись называет запрошенный темп.
p50, p90, p95, p99Время, за которое завершилась эта доля запросов, включая неудачные; точность до 0,5 %
Среднее, Мин, МаксСреднее, самое быстрое и самое медленное

Числа обновляются около 10 раз в секунду. График рядом с ними рисует запросы в секунду за последние примерно 24 секунды.

С Digest на вызов первого запроса отвечают один раз, и этот ответ обслуживает все запросы потока.

WARNING

Нагрузочный поток — это настоящая нагрузка. Направляйте его только на серверы, которыми вы владеете или которые вам разрешено тестировать.

Для нарастания, ступеней, всплесков и порогов «пройдено/не пройдено» запускайте запрос под нагрузкой в эксперименте.

В Инспекторе ​

Когда захват включён, каждый обмен появляется как один кадр с протоколом http и источником http: метод, URL, статус и время — в сводке, заголовки ответа и начало тела (2000 символов) — в подробностях, статус — как вердикт (failed, если ответа не было, · digest after 401, если на вызов ответили). Кадр записывает размер тела, а не его байты. Заголовка Authorization запроса в нём никогда нет. Нагрузочный поток передаёт в захват не более одного обмена за 100 мс. См. Инспектор.

Сохранение и повторное использование ​

  • Сохранить как сигнал. Кнопка Сохранить… сохраняет запрос — метод, URL, заголовки, тело, тайм-аут и аутентификацию — в библиотеке сигналов. Экран остаётся связан с ним: Сохранить (Ctrl+S) обновляет его, Сохранить как… делает копию, плашка открывает его на экране Сигналы. Если открыть HTTP-сигнал из библиотеки, он загружается обратно сюда вместе с учётными данными. См. Сигналы.
  • Добавить в эксперимент. Кнопка В эксперимент добавляет в открытый эксперимент узел HTTP-запрос с тем же запросом — прямо перед узлом «Финиш» или после выбранного узла — и открывает его.
  • Имитировать ответ. Под ответом кнопка Сымитировать создаёт маршрут эмулятора, который отвечает на этот метод и путь с этим статусом, заголовками и телом. Выберите HTTP-эмулятор в поле Добавить в или вариант Новый эмулятор и нажмите Добавить маршрут; маршрут встаёт в этом эмуляторе первым, и экран Эмуляторы открывается на нём. См. Эмуляторы.

В экспериментах ​

УзелЧто он делает
HTTP-запросОтправляет запрос; его URL, заголовки, тело и учётные данные принимают {{templates}}. Может работать под нагрузкой. Подробнее
Статус HTTP, Текст ответа, Заголовок ответа, Время ответаПроверяют последний ответ. Подробнее
Извлечь значениеСохраняет в переменную поле JSON, заголовок, статус, тело или совпадение регулярного выражения. Подробнее
Ветвление по статусуИдёт дальше по выходу «Да» или «Нет» в зависимости от статуса. Подробнее
Ждать HTTP-запросЖдёт, пока придёт запрос — от тестируемой системы — на собственный слушатель или эмулятор запуска. Подробнее
ЭмуляторHTTP API, который отвечает по маршрутам на протяжении всего запуска. Подробнее

Из командной строки ​

signallab send http отправляет один запрос так же, как этот экран:

bash
signallab send http GET http://127.0.0.1:8080/health --expect-status 200
signallab send http POST http://127.0.0.1:8080/api/items \
  -H 'Content-Type: application/json' --body '{"name":"lamp"}'
signallab send http GET http://127.0.0.1:8080/private -u admin:secret --digest

Строка статуса уходит в стандартный поток ошибок, а тело — в стандартный вывод:

text
HTTP 200 OK · 3 ms · 15 B
{"status":"ok"}
ПараметрЧто делаетПо умолчанию
-H, --header 'Name: value'Заголовок; повторите для нескольких—
--body TEXT, --body @FILEТело или содержимое файла—
--expect-status NЗавершить с кодом 1, если статус не N—
--timeout MSСколько ждать ответа10 000
-u, --user NAME:PASSWORDАутентификация Basic—
--digestВместе с --user: вместо этого ответить на вызов Digest от сервера—
--bearer TOKENAuthorization: Bearer TOKEN—
--jsonВывести весь ответ как JSON в стандартный вывод—

Код завершения: 0, если ответ пришёл (и статус оказался ожидаемым), 1, если ответа нет, статус не тот, что ожидался, или на вызов Digest не удалось ответить, и 2, если параметр недопустим. Cookie команда не хранит. См. Командная строка.

Проблемы ​

Что вы видитеОбычная причина
… refused the connection — nothing is listening on that portСервер не запущен или слушает другой порт либо адрес.
No answer from … in timeСервер медленный или недоступен; проверьте адрес или увеличьте Таймаут (мс).
Cannot resolve …Имя хоста не разрешается на этом компьютере — опечатка или имя, которое известно только другой сети.
A secure connection to … could not be madeСертификату здесь не доверяют (самоподписанный, просроченный, другое имя) или не удалось установить TLS. См. Защищённые соединения.
… is not a valid addressURL некорректен или не начинается с http:// либо https://.
Сервер сообщает, что тела нет или оно не того типаНет заголовка Content-Type, подходящего к телу, или тело пустое.
401 при DigestПрочитайте сообщение под статусом: см. Digest.
Пропущено больше 0Увеличьте Параллельность или снизьте темп: сервер отвечает медленнее, чем нужно для этого темпа.
Значение Ошибок велико, хотя сервер отвечаетЛюбой статус вне 200–299 считается ошибкой, включая 404 и 500.

На сервере запросы уходят с сервера: 127.0.0.1 — это сам сервер. См. Сервер.

Все сообщения об ошибках перечислены в разделе Сообщения об ошибках.