Parser nagłówków HTTP

Wklej całe żądanie lub odpowiedź HTTP — blok, który wypisuje curl -v, albo to, co pokazuje panel Sieć przeglądarki — a każdy wiersz nagłówka zostanie zdekodowany: nazwa, wartość, zdanie prostym językiem o tym, co robi, oraz dokument, który go definiuje. Set-Cookie jest rozbierany atrybut po atrybucie (Secure, HttpOnly, SameSite, Max-Age, Expires…), parametry Content-Type i Accept są rozwijane, a blok jest sprawdzany pod kątem klasycznych problemów strukturalnych: przestarzałych zwiniętych linii, niedozwolonych znaków, zduplikowanych nagłówków i nagłówków wysłanych w złym kierunku. Wszystko działa w przeglądarce i nic nie jest wysyłane.
Automatycznie patrzy na pierwszy wiersz: linia żądania (GET /path HTTP/1.1) oznacza żądanie, linia statusu (HTTP/1.1 200 OK) oznacza odpowiedź, a cokolwiek innego jest odczytywane jako goły blok nagłówków. Pozostałe wybory wymuszają kierunek, co zmienia, które ostrzeżenia obowiązują.
Nic jeszcze nie sparsowano. Wklej powyżej blok żądania lub odpowiedzi i naciśnij Parsuj nagłówki, albo naciśnij Próbka, aby zobaczyć przykład.
Skąd wziąć blok wart sparsowania. W terminalu curl -v https://example.com/ 2>&1 wypisuje żądanie i odpowiedź z prefiksami > i < — usuń je i wklej. curl -sI https://example.com/ daje sam blok nagłówków odpowiedzi. W przeglądarce otwórz narzędzia deweloperskie, kartę Sieć, przeładuj, wybierz żądanie dokumentu i użyj Kopiuj → Kopiuj nagłówki odpowiedzi; po stronie żądania użyj Kopiuj jako cURL i przeczytaj flagi. Zwykły blok linii Nazwa: wartość bez linii startowej też się parsuje — sprawdzanie kierunku jest wtedy złagodzone.
Autotest
Ponownie uruchamia parser na stałych blokach: wykrywanie kierunku, obie pule próbek, każdą regułę atrybutów Set-Cookie (SameSite=None bez Secure, nienumeryczny Max-Age, zepsute Expires, nieznany atrybut, ciasteczko bez znaku równości), łączenie obs-fold, niedozwolone nazwy pól, zduplikowane nagłówki, niezgodności kierunku i ścieżki negatywne. Nic nigdzie nie jest wysyłane.
Czym jest nagłówek HTTP?
W jednym zdaniu: wiadomość HTTP to linia startowa, blok linii Nazwa: wartość zwanych nagłówkami, pusta linia i opcjonalna treść — nagłówki niosą wszystko o wiadomości poza samą treścią: kto ją wysłał, co może przyjąć, jak jest buforowana, jak jest uwierzytelniana i czego nadawca oczekuje w zamian.
Cztery rodziny
RodzinaPodróżuje dalejPrzykładyOdpowiada na pytanie
Nagłówki żądaniaklient → serwerHost, Accept, Cookie, Referer, Authorizationczego chce klient i za kogo się podaje
Nagłówki odpowiedziserwer → klientLocation, Server, Set-Cookie, Retry-Afterco zrobił serwer i czego żąda w zamian
Nagłówki reprezentacjioba, dotyczące treściContent-Type, Content-Length, Content-Encoding, ETagw jakim formacie jest treść i która to jej kopia
Nagłówki kontrolneoba, dotyczące połączeniaCache-Control, Connection, Via, Transfer-Encodingjak wiadomość i połączenie są obsługiwane po drodze

Niektóre nagłówki są stanowczo jednokierunkowe: If-None-Match ma sens tylko w żądaniu, a Set-Cookie tylko w odpowiedzi. Parsowanie w złym kierunku to jeden z klasycznych błędów debugowania kopiuj-wklej, dlatego ta strona to oznacza.

Gramatyka wiersza nagłówka

RFC 9110 definiuje wiersz pola jako field-name ":" OWS field-value OWS — nazwę złożoną wyłącznie ze znaków tokenu (litery, cyfry i !#$%&'*+-.^_`|~), dwukropek bez spacji przed nim oraz wartość ze znaków widocznych, spacji i tabulatorów. Nazwy nagłówków nie rozróżniają wielkości liter (content-type równa się Content-Type); wartości są prawie zawsze wrażliwe na wielkość liter. Wiersz zaczynający się od spacji lub tabulatora kontynuował poprzedni nagłówek — obs-fold, przestarzałe od 2014 roku: proxy, które go rozwija, może zmienić znaczenie nagłówka, więc parser tutaj łączy go, ale ostrzega, że taki wiersz istnieje.

Typowe błędy
  • Ufanie X-Forwarded-For. Dodaje go każdy proxy na drodze, a klient może sfałszować pierwszy przeskok. Mówi, co twierdzi łańcuch proxy, a nie kto jest połączony; traktuj to jako wskazówkę i preferuj proxy, który sam nadpisuje ten nagłówek.
  • Czytanie tylko nagłówków odpowiedzi. Połowa ciekawych błędów (zduplikowany Accept, brakujący Host, nagłówek autoryzacji wysłany do złego hosta) siedzi w żądaniu, które przeglądarka domyślnie ukrywa. Użyj Kopiuj jako cURL, aby zobaczyć swoje.
  • Łączenie wierszy Set-Cookie. Większość zduplikowanych nagłówków można połączyć przecinkami — Set-Cookie nie wolno, bo przecinek występuje wewnątrz samej wartości. Przeglądarki traktują każdy wiersz jako osobne ciasteczko.
  • Oczekiwanie, że Content-Length to rozmiar treści, który napisano. To rozmiar po zastosowaniu Content-Encoding i tylko gdy wiadomość nie jest w porcjach (chunked); odpowiedź z Transfer-Encoding: chunked nie ma sensownej pojedynczej długości.
  • Ocenianie nagłówków po prefiksie X-. Ta konwencja wygasła w RFC 6648: X-Forwarded-For i X-Content-Type-Options są stałymi standardami de facto, a wiele nagłówków bez X jest eksperymentalnych. Oceniaj po dokumencie definiującym, a nie po prefiksie.
FAQ

Czy bezpiecznie jest wklejać tu nagłówki? Parsowanie odbywa się w całości w przeglądarce i nic nie jest wysyłane. Mimo to skopiowany blok nagłówków to odcisk palca: ciasteczka, nagłówki autoryzacji i dokładny User-Agent razem mogą zidentyfikować osobę, która je wkleiła, więc warto parsować tylko bloki, których pokazanie koledze nie byłoby problemem.

Dlaczego moja przeglądarka pokazuje nagłówki takie jak :status, które ta strona nazywa błędami? To pseudo-nagłówki HTTP/2 i HTTP/3 — warstwy binarnej ramki zastępują linię startową i Host pseudo-polami. Ta strona parsuje klasyczny tekst HTTP/1.1; pseudo-nagłówki to te same informacje po przetłumaczeniu przez protokół.

Co się stało z X-XSS-Protection? Jest wycofany: audytor, którym sterował, sam powodował błędy bezpieczeństwa, a przeglądarki go usunęły. Jego zadanie przejęła Content-Security-Policy — zbuduj ją w generatorze CSP i sprawdź cały zestaw w sprawdzaniu nagłówków bezpieczeństwa.

Jak sprawdzany jest atrybut Set-Cookie? Według RFC 6265: nazwy i wartości są dzielone na pierwszym znaku równości, atrybuty po pierwszym średniku, Expires musi być datą w formacie ciasteczka, Max-Age cyframi, SameSite jedną z wartości Strict/Lax/None — a None bez Secure jest odrzucane przez współczesne przeglądarki, więc jest to wyróżnione.

Czy mogę sparsować tylko listę wierszy nagłówków? Tak — wybierz Tylko blok nagłówków i wklej bez linii startowej. Sprawdzanie kierunku jest złagodzone; cała reszta (struktura, Set-Cookie, parametry) nadal działa.