HTTP-header-parser — anmodnings- og svarheadere, afkodet linje for linje
HTTP-headerparser
Indsæt en hel HTTP-anmodning eller et helt svar — blokken curl -v udskriver, eller det browserens netværkspanel viser — og hver headerlinje afkodes: navnet, værdien, en sætning på almindeligt sprog om, hvad den gør, og dokumentet, der definerer den. Set-Cookie skilles ad attribut for attribut (Secure, HttpOnly, SameSite, Max-Age, Expires…), Content-Type- og Accept-parametre udvides, og blokken revideres for de klassiske strukturelle problemer: forældede foldede linjer, ulovlige tegn, dubletheadere og headere sendt i den forkerte retning. Alt kører i browseren, og intet uploades.
Input
Automatisk kigger på den første linje: en anmodningslinje (GET /sti HTTP/1.1) betyder anmodning, en statuslinje (HTTP/1.1 200 OK) betyder svar, og alt andet læses som en ren headerblok. De øvrige valg fastlægger retningen, hvilket ændrer, hvilke advarsler der gælder.
Parset rapport
Intet parset endnu. Indsæt en anmodnings- eller svarblok ovenfor, og tryk på Parse headere, eller tryk på Eksempel for et gennemarbejdet eksempel.
Hvor man får en blok, der er værd at parse. I en terminal udskriver curl -v https://example.com/ 2>&1 anmodningen og svaret med præfikserne > og < — fjern dem, og indsæt. curl -sI https://example.com/ giver kun svarheaderblokken. I browseren: åbn udviklerværktøjer, fanen Netværk, genindlæs, vælg dokumentanmodningen og brug Kopiér → Kopiér svarheadere; til anmodningssiden brug Kopiér som cURL og læs flagene. En ren blok med Navn: værdi-linjer uden startlinje parses også — retningstjekkene lempes så.
Selvtest Kører parseren igen mod faste blokke: retningsregistrering, begge eksempelpuljer, hver Set-Cookie-attributregel (SameSite=None uden Secure, en ikke-numerisk Max-Age, en ødelagt Expires, en ukendt attribut, en cookie uden lighedstegn), obs-fold-sammenføjning, ulovlige feltnavne, dubletheadere, retningsmismatch og de negative stier. Intet sendes nogen steder.
Hvad er en HTTP-header?
I én sætning: en HTTP-meddelelse er en startlinje, en blok af Navn: værdi-linjer kaldet headere, en tom linje og et valgfrit body — headerne bærer alt om meddelelsen undtagen selve body'et: hvem der sendte den, hvad den kan acceptere, hvordan den caches, hvordan den autentificeres, og hvad afsenderen ønsker tilbage.
De fire familier
Familie
Rejser med
Eksempler
Besvarer spørgsmålet
Anmodningsheadere
klient → server
Host, Accept, Cookie, Referer, Authorization
hvad klienten ønsker, og hvem den hævder at være
Svarheadere
server → klient
Location, Server, Set-Cookie, Retry-After
hvad serveren gjorde, og hvad den beder om til gengæld
hvilket format body'et er i, og hvilken kopi af det dette er
Kontrolheadere
begge, om forbindelsen
Cache-Control, Connection, Via, Transfer-Encoding
hvordan meddelelsen og forbindelsen håndteres undervejs
Nogle headere er fast énretnings: If-None-Match giver kun mening i en anmodning, og Set-Cookie kun i et svar. Parsing i den forkerte retning er en af de klassiske copy-paste-fejlfindingsfejl, og derfor markerer denne side det.
Grammatikken for en headerlinje
RFC 9110 definerer en feltlinje som field-name ":" OWS field-value OWS — et navn bestående udelukkende af token-tegn (bogstaver, cifre og !#$%&'*+-.^_`|~), et kolon med intet mellemrum før det, og en værdi af synlige tegn, mellemrum og tabulatorer. Headernavne er ikke versalfølsomme (content-type er lig med Content-Type); værdier er næsten altid versalfølsomme. En linje, der starter med et mellemrum eller en tabulator, fortsatte tidligere den forrige header — obs-fold, forældet siden 2014: en proxy, der folder den ud, kan ændre headerens betydning, så parseren her samler den, men advarer om, at den findes.
Almindelige fejl
At stole på X-Forwarded-For. Den tilføjes af hver proxy på vejen, og en klient kan forfalske det første hop. Den fortæller, hvad en kæde af proxyer hævder, ikke hvem der er forbundet; behandl den som et hint, og foretræk en proxy, man selv kontrollerer, til at overskrive den.
Kun at læse svarheaderne. Halvdelen af de interessante fejl (en dobbelt Accept, en manglende Host, en autorisationsheader rettet mod forkert vært) ligger i anmodningen, som browseren skjuler som standard. Brug Kopiér som cURL for at se sin egen.
Sammenfletning af Set-Cookie-linjer. De fleste dobbelte headere må kombineres med kommaer — Set-Cookie må ikke, fordi kommaet optræder inde i selve værdien. Browsere behandler hver linje som en separat cookie.
At forvente, at Content-Length er den body-størrelse, man skrev. Det er størrelsen efter Content-Encoding er anvendt, og kun når meddelelsen ikke er chunked; et Transfer-Encoding: chunked-svar har ingen meningsfuld enkelt længde.
At vurdere headere ud fra deres X--præfiks. Konventionen døde med RFC 6648: X-Forwarded-For og X-Content-Type-Options er permanente de facto-standarder, mens mange ikke-X-headere er eksperimentelle. Vurder efter det definerende dokument, ikke præfikset.
Ofte stillede spørgsmål
Er det sikkert at indsætte headere her? Parsingen sker helt i browseren, og intet uploades. Ikke desto mindre er en kopieret headerblok et fingeraftryk: cookies, autorisationsheadere og den præcise User-Agent kan tilsammen identificere en, så parse kun blokke, som man ikke har noget imod at vise en kollega.
Hvorfor viser browseren headere som :status, som denne side kalder fejl? Det er HTTP/2- og HTTP/3-pseudoheadere — de binære rammelag erstatter startlinjen og Host med pseudofelter. Denne side parser den klassiske HTTP/1.1-wiretekst; pseudoheadere er den samme information, efter protokollen har oversat den.
Hvad skete der med X-XSS-Protection? Den er forældet: auditoren, den drev, forårsagede sine egne sikkerhedsfejl, og browsere har fjernet den. Dens opgave hører til en Content-Security-Policy — byg en på CSP-generatoren, og revider hele sættet på sikkerhedsheader-tjekket.
Hvordan tjekkes en Set-Cookie-attribut? Mod RFC 6265: navne og værdier deles ved det første lighedstegn, attributter efter det første semikolon, Expires skal være en dato i cookie-formatet, Max-Age skal være cifre, og SameSite skal være én af Strict/Lax/None — og None uden Secure afvises af nuværende browsere, så det fremhæves.
Kan jeg parse en liste over headerlinjer alene? Ja — vælg Kun headerblok, og indsæt uden en startlinje. Retningstjek lempes; alt andet (struktur, Set-Cookie, parametre) køres stadig.