Парсер HTTP-заголовков — заголовки запроса и ответа, разобранные построчно
Парсер HTTP-заголовков
Вставьте целый HTTP-запрос или ответ — блок, который печатает curl -v, или то, что показывает панель «Сеть» браузера — и каждая строка заголовка будет разобрана: имя, значение, объяснение простым языком того, что он делает, и документ, который его определяет. Set-Cookie разбирается по атрибутам (Secure, HttpOnly, SameSite, Max-Age, Expires…), параметры Content-Type и Accept раскрываются, а блок проверяется на классические структурные проблемы: устаревшие сворачивания строк, недопустимые символы, дубликаты заголовков и заголовки, отправленные не в ту сторону. Всё выполняется в вашем браузере, ничего не загружается.
Ввод
Автоматически смотрит на первую строку: строка запроса (GET /path HTTP/1.1) означает запрос, строка состояния (HTTP/1.1 200 OK) — ответ, всё прочее читается как голый блок заголовков. Остальные варианты задают направление принудительно, а это меняет, какие предупреждения применяются.
Отчёт о разборе
Пока ничего не разобрано. Вставьте блок запроса или ответа выше и нажмите Разобрать заголовки или Пример, чтобы увидеть разобранный случай.
Где взять блок, достойный разбора. В терминале curl -v https://example.com/ 2>&1 печатает запрос и ответ с префиксами > и < — уберите их и вставьте. curl -sI https://example.com/ даёт только блок заголовков ответа. В браузере откройте инструменты разработчика, вкладку «Сеть», обновите страницу, выберите запрос документа и используйте Копировать → Копировать заголовки ответа; для стороны запроса используйте Копировать как cURL и читайте флаги. Голый блок строк Имя: значение без начальной строки тоже разбирается — проверки направления тогда смягчаются.
Самопроверка Повторно запускает парсер на фиксированных блоках: определение направления, оба набора примеров, каждое правило атрибутов Set-Cookie (SameSite=None без Secure, нечисловой Max-Age, неверный Expires, неизвестный атрибут, cookie без знака равенства), склейку obs-fold, недопустимые имена полей, дубликаты заголовков, несовпадения направления и отрицательные пути. Ничего никуда не отправляется.
Что такое HTTP-заголовок?
Одним предложением: сообщение HTTP — это начальная строка, блок строк Имя: значение, называемых заголовками, пустая строка и необязательное тело; заголовки несут всё о сообщении, кроме самого тела: кто его отправил, что он может принять, как кешируется, как аутентифицируется и что отправитель хочет получить в ответ.
Некоторые заголовки строго однонаправленные: If-None-Match имеет смысл только в запросе, а Set-Cookie — только в ответе. Разбор в неверном направлении — одна из классических ошибок отладки при копировании и вставке, поэтому эта страница её отмечает.
Грамматика строки заголовка
RFC 9110 определяет строку поля как field-name ":" OWS field-value OWS — имя, состоящее только из символов токена (буквы, цифры и !#$%&'*+-.^_`|~), двоеточие без пробела перед ним и значение из видимых символов, пробелов и табуляций. Имена заголовков нечувствительны к регистру (content-type равно Content-Type); значения почти всегда чувствительны к регистру. Строка, начинающаяся с пробела или табуляции, раньше продолжала предыдущий заголовок — obs-fold, устаревший с 2014 года: прокси, который её разворачивает, может изменить смысл заголовка, поэтому парсер здесь склеивает её, но предупреждает вас о ней.
Частые ошибки
Доверие X-Forwarded-For. Его добавляет каждый прокси на пути, а клиент может подделать первый переход. Он сообщает, что утверждает цепочка прокси, а не кто подключён; считайте его подсказкой и предпочитайте прокси, который вы контролируете и который его перезаписывает.
Чтение только заголовков ответа. Половина интересных ошибок (дублированный Accept, отсутствующий Host, заголовок авторизации, направленный не на тот хост) живёт в запросе, который браузер по умолчанию скрывает. Используйте Копировать как cURL, чтобы увидеть свой.
Слияние строк Set-Cookie. Большинство дублированных заголовков можно объединять запятыми — Set-Cookie нельзя, потому что запятая находится внутри самого значения. Браузеры считают каждую строку отдельным cookie.
Ожидание, что Content-Length — это тот размер тела, который вы написали. Это размер после применения Content-Encoding и только когда сообщение не chunked; у ответа с Transfer-Encoding: chunked нет осмысленной единой длины.
Оценка заголовков по префиксу X-. Соглашение умерло в RFC 6648: X-Forwarded-For и X-Content-Type-Options — постоянные де-факто стандарты, тогда как многие не-X заголовки экспериментальны. Судите по определяющему документу, а не по префиксу.
Частые вопросы
Безопасно ли вставлять сюда заголовки? Разбор полностью выполняется в вашем браузере, и ничего не загружается. Тем не менее скопированный блок заголовков — это отпечаток: cookie, заголовки авторизации и точная строка User-Agent вместе могут вас идентифицировать, поэтому разбирайте блоки, которые не жалко показать коллеге.
Почему мой браузер показывает заголовки вроде :status, которые эта страница считает ошибками? Это псевдозаголовки HTTP/2 и HTTP/3 — бинарные уровни кадрирования заменяют начальную строку и Host псевдополями. Эта страница разбирает классический текст HTTP/1.1 на проводе; псевдозаголовки — та же информация после того, как протокол её перевёл.
Что случилось с X-XSS-Protection? Он устарел: управляемый им аудитор сам порождал ошибки безопасности, и браузеры его удалили. Его задача принадлежит Content-Security-Policy — создайте её в генераторе CSP и проверьте весь набор в проверке заголовков безопасности.
Как проверяется атрибут Set-Cookie? По RFC 6265: имена и значения делятся по первому знаку равенства, атрибуты — после первой точки с запятой, Expires должен быть датой в формате cookie, Max-Age — цифрами, SameSite — одним из Strict/Lax/None — а None без Secure отвергается текущими браузерами, поэтому это отмечается.
Можно ли разобрать только список строк заголовков? Да — выберите Только блок заголовков и вставьте без начальной строки. Проверки направления смягчаются; всё остальное (структура, Set-Cookie, параметры) всё равно работает.