Парсер 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 — назву лише з символів token (літери, цифри і !#$%&'*+-.^_`|~), двокрапку без пробілу перед нею і значення з видимих символів, пробілів і табуляцій. Назви заголовків нечутливі до регістру (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 експериментальні. Оцінюйте за визначальним документом, а не за префіксом.
Часті запитання (FAQ)
Чи безпечно вставляти заголовки сюди? Розбір відбувається повністю у вашому браузері, і нічого не вивантажується. Водночас скопійований блок заголовків є відбитком: 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, параметри) все одно працює.