HTTP
Экран HTTP — одновременно инструмент разбора запросов и инструмент нагрузки:
- отправить один запрос и увидеть статус, затраченное время, заголовки и тело;
- аутентифицироваться по Basic, Bearer-токеном или по Digest;
- хранить cookie, которые выставляет сервер, как это делает браузер;
- отправлять один и тот же запрос много раз одновременно (блок Нагрузочный поток) и читать пропускную способность и перцентили задержки.
Отправка запроса
- Откройте HTTP.
- Выберите метод и введите URL, например
http://127.0.0.1:8080/health. - Добавьте в блок Заголовки нужные серверу заголовки; кнопка + заголовок добавляет строку, ✕ удаляет. Строка без имени не отправляется.
- Для метода, отличного от GET и HEAD, напишите тело запроса в поле Тело. Текст остаётся в поле, пока вы переключаетесь на GET или HEAD, и возвращается вместе с другим методом, но в это время не отправляется.
- Нажмите Отправить.
Строка под кнопками сразу выносит вердикт — статус, время и размер либо причину, по которой ответа нет, — а остальное показывает панель Ответ. Запрос (метод, URL, заголовки, тело, тайм-аут и параметр Хранить cookie) сохраняется при переключении экранов и при перезапуске приложения; учётные данные — нет.
| Клавиша | Где | Что делает |
|---|---|---|
| Enter | URL, заголовок, учётные данные, тайм-аут | отправляет |
| Ctrl+Enter | любое поле запроса, включая тело | отправляет |
| Ctrl+S | любое поле запроса | сохраняет как сигнал (ниже) |
Поля запроса
| Поле | Что это | По умолчанию |
|---|---|---|
| Метод | GET, POST, PUT, PATCH, DELETE, HEAD или OPTIONS | GET |
| URL | URL с 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–512 | 20 |
| Всего | Сколько запросов отправить; 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 отправляет один запрос так же, как этот экран:
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Строка статуса уходит в стандартный поток ошибок, а тело — в стандартный вывод:
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 TOKEN | Authorization: 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 address | URL некорректен или не начинается с http:// либо https://. |
| Сервер сообщает, что тела нет или оно не того типа | Нет заголовка Content-Type, подходящего к телу, или тело пустое. |
401 при Digest | Прочитайте сообщение под статусом: см. Digest. |
| Пропущено больше 0 | Увеличьте Параллельность или снизьте темп: сервер отвечает медленнее, чем нужно для этого темпа. |
| Значение Ошибок велико, хотя сервер отвечает | Любой статус вне 200–299 считается ошибкой, включая 404 и 500. |
На сервере запросы уходят с сервера: 127.0.0.1 — это сам сервер. См. Сервер.
Все сообщения об ошибках перечислены в разделе Сообщения об ошибках.