Верстак 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-required | 400 с телом в стиле nginx “No required SSL certificate” |
unauthorized / forbidden / not-found | 401 / 403 / 404 |
rate-limited | 429 |
antifraud-reject | 451 |
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), а конфигурация исходящего прокси не записывается никогда.