Верстак replay

Повторная отправка одиночных запросов с правкой и измерением дрейфа.

Верстак replay повторно отправляет один захваченный запрос на живой сервер, позволяет отредактировать любую его часть, а затем сопоставляет живой ответ с захваченным. Инструмент предназначен для авторизованного тестирования систем, на которые у вас есть разрешение: каждый из описанных ниже предохранителей нужен для того, чтобы replay оставался осознанным и ограниченным действием.

Открытие верстака

В API lab откройте вкладку Catalog (см. /docs/ru/api-re/catalog/), разверните маршрут и нажмите значок play (Replay request) на любой строке захваченного запроса. Диалог откроется с безопасной копией запроса: заголовки с учётными данными, чувствительные значения query, сегменты пути, похожие на секреты, и секреты в теле скрыты, пока вы явно не разрешите их использование.

Редактирование запроса

  • Method — свободный текст, при отправке приводится к верхнему регистру; должен состоять из 1–32 допустимых символов HTTP-токена.
  • URL — должен быть абсолютным URL с http или https. Кнопка Reset восстанавливает захваченный URL.
  • Headers — редактируемая таблица имя/значение. Заголовки, управляемые транспортом (Host, Content-Length, Connection, Transfer-Encoding, TE, Trailer, Upgrade, Keep-Alive, Accept-Encoding, Proxy-Authenticate, Proxy-Authorization), а также псевдозаголовки HTTP/2 исключены и недоступны для правки. Имена должны быть корректными HTTP-токенами, уникальными в пределах заголовка, а значения не должны содержать управляющих символов.
  • Body — текстовый редактор. Структурированные тела (JSON, формы) открываются со скрытыми секретами; для непрозрачного (бинарного или неструктурированного) тела показывается заглушка, и отправка блокируется, пока вы либо явно не введёте тело, либо не разрешите использование захваченных байт.
  • Timeout — 1–120 секунд, по умолчанию 30.

Модель безопасности

ПредохранительПоведение
Без следования редиректамОтветы 3xx возвращаются как есть (класс отклонения redirect), чтобы вы видели реальный ответ эндпоинта.
Ограничения таймаута и предпросмотраТаймаут на запрос ограничен 120 с; предпросмотр тел ответов ограничен 4 MiB.
Учётные данные исключены по умолчаниюЗахваченные заголовки авторизации/cookie, чувствительные значения query, секреты в пути и в теле удаляются, если не отмечен флажок Include captured credentials in this replay.
Подтверждение мутирующих запросовЛюбой метод, отличный от GET, HEAD или OPTIONS, требует флажка Confirm potentially state-changing request, прежде чем кнопка отправки станет активной.
Подтверждение назначенияИзменение URL на другую схему, хост или порт требует Confirm destination change.
Типизированные заменыВведённые вами значения заголовков или учётных данных считаются осознанными и отправляются точно в том виде, в каком введены.

Бэкенд применяет ограничения на запросы независимо от UI: тело запроса ≤ 16 MiB, URL ≤ 16 KiB, ≤ 256 правок заголовков на replay, значение заголовка ≤ 64 KiB.

[!WARNING] Replay отправляет запросы на реальные эндпоинты. Перед нажатием Replay убедитесь, что у вас есть авторизация на отправку отредактированного запроса — особенно для методов, меняющих состояние, или A/B-проверок с учётными данными.

Отправка и чтение ответа

Нажмите Replay <METHOD>. Строка результата показывает статус, длительность, транспорт и профиль ClientHello, ID из истории replay, gRPC-трейлеры (grpc-status/grpc-message), если они есть, и бейдж класса отклонения, когда ответ не 2xx:

КлассЗначение
client-certificate-required400 с телом в стиле nginx “No required SSL certificate”
unauthorized / forbidden / not-found401 / 403 / 404
rate-limited429
antifraud-reject451
redirectлюбой другой 3xx
client-error / server-errorостальные 4xx / 5xx
transport-errorзапрос не удался до получения ответа

Дрейф между захваченным и живым

Под результатом блок Original ↔ replay diff сравнивает захваченный обмен с живым, используя общее семантическое сравнение (/docs/ru/analysis/comparing/), и выносит вердикт: match, drift или transport-error. Признаки дрейфа:

  • Status drift — статус-код захваченного против повторного.
  • Header changes — добавленные/удалённые/изменённые заголовки ответа, с игнорированием нестабильных (Date, ETag, Set-Cookie, X-Request-Id, CF-Ray, trace ID и тому подобных).
  • Semantic body diff — полевое сравнение JSON, Form, XML, HTML или CSV с подсчётом изменившихся полей; для нераспознанных тел выводится пометка о различии в байтах.
  • Duration delta — миллисекунды повторной отправки минус захваченной.

Переменные цепочки и вычисляемые поля

Используйте {{name}} в URL, значениях заголовков или теле. После replay опция Extract response into chain сохраняет JSON-путь ($.access_token), заголовок ответа или совпадение по regex как переменную, которая хранится локально для последующих запросов. Вычисляемые поля пересчитываются при каждой отправке:

{{ cookie:gssca-goldapple }}   {{ header:x-ts }}   {{ query:item }}
{{ p = randomHex:4; p + sha1(fgsscSecret + cookie:gssca-goldapple + p) | skip:4 }}
{{ hmac-sha256(secret, "msg") }}   {{ nowMs() }}   {{ uuid4() }}   {{ crc32(body) }}

Именованные нонсы (p = randomHex:4) остаются стабильными во всех полях одного replay; среди пайпов доступны skip, take, upper, lower, urlencode, base64, base64url. Панель Fingerprint & egress в том же диалоге выбирает транспорт (нативный Go или uTLS с точным соответствием отпечатка), профиль ClientHello, принудительный HTTP/1.1, прокси для исходящего трафика (http, https, socks5, socks5h) и клиентский сертификат mTLS (auto использует сертификат, привязанный к хосту).

Массовый replay

На маршруте в Catalog нажмите Replay all & diff. Диалог последовательно повторяет до 200 наблюдавшихся вызовов этого маршрута, сгруппированных по захвату, показывая построчно статус captured → replayed и вердикт match/drift/skipped, а также накопительные счётчики совпадений и дрейфа.

  • Бэкенд принимает не более 50 запросов в батче; диалог автоматически разбивает большие наборы на части.
  • Если метод маршрута может менять состояние, запуск блокируется, пока не отмечен флажок I confirm this may change server state.
  • Include captured credentials применяется ко всему батчу; таймаут на запрос — 30 с, а общий дедлайн (запросы × таймаут + 30 с) ограничивает время запуска.

История replay

Каждый завершённый replay сохраняется в локальную базу данных (когда хранилище доступно); сбой сохранения выводит предупреждение “history not retained”, а не теряет ответ. Откройте вкладку Replays в API lab, чтобы просмотреть последние 100 записей: каждая строка показывает метод, URL, статус, длительность и метку времени. Разверните строку для полного сравнения original ↔ replay, удалите ненужные записи или нажмите Derive capture, чтобы превратить replay в отдельную сессию захвата.

Сохраняемая история санируется: если replay не включал захваченные учётные данные, URL, заголовки и тела скрываются перед сохранением (предпросмотр тела ограничен 32 KiB), а конфигурация исходящего прокси не записывается никогда.

Документация Traffic Jam. Собрано с помощью Hugo.