HTTP Header Parser — forespørsels- og svarheadere, dekodet linje for linje
HTTP-headerparser
Lim inn en hel HTTP-forespørsel eller et helt svar — blokken curl -v skriver ut, eller det nettverkspanelet i nettleseren viser — så dekodes hver headerlinje: navnet, verdien, en setning på vanlig språk om hva den gjør, og dokumentet som definerer den. Set-Cookie plukkes fra hverandre attributt for attributt (Secure, HttpOnly, SameSite, Max-Age, Expires…), parametere i Content-Type og Accept utvides, og blokken kontrolleres for de klassiske strukturproblemene: foldede linjer som er utdaterte, ulovlige tegn, dupliserte headere og headere som er sendt i feil retning. Alt kjører i nettleseren, og ingenting lastes opp.
Inndata
Automatisk ser på den første linjen: en forespørselslinje (GET /path HTTP/1.1) betyr forespørsel, en statuslinje (HTTP/1.1 200 OK) betyr svar, og alt annet leses som en ren headerblokk. De andre valgene tvinger retningen, noe som endrer hvilke advarsler som gjelder.
Tolket rapport
Ingenting er tolket ennå. Lim inn en forespørsels- eller svarblokk ovenfor og trykk Parse headere, eller trykk Eksempel for et utarbeidet eksempel.
Hvor man får en blokk som er verdt å tolke. I en terminal skriver curl -v https://example.com/ 2>&1 ut forespørselen og svaret med >- og <-prefikser — fjern dem og lim inn. curl -sI https://example.com/ gir bare svarheaderblokken. I nettleseren, åpne utviklerverktøyene, fanen Nettverk, last inn på nytt, velg dokumentforespørselen og bruk Kopier → Kopier svarheadere; for forespørselsdelen brukes Kopier som cURL og flaggene leses. En ren blokk med Navn: verdi-linjer uten startlinje tolkes også — retningskontrollene er da mildere.
Selvtest Kjører parseren på nytt mot faste blokker: retningsdeteksjon, begge eksempelsettene, hver Set-Cookie-attributtregel (SameSite=None uten Secure, en ikke-numerisk Max-Age, en ødelagt Expires, et ukjent attributt, en informasjonskapsel uten likhetstegn), sammenslåing av obs-fold, ulovlige feltnavn, dupliserte headere, retningsavvik og de negative stiene. Ingenting sendes noe sted.
Hva er en HTTP-header?
I én setning: en HTTP-melding er en startlinje, en blokk med Navn: verdi-linjer kalt headere, en tom linje og en valgfri body — headerne bærer alt om meldingen unntatt selve body-en: hvem som sendte den, hva den kan godta, hvordan den caches, hvordan den autentiseres og hva avsenderen vil ha tilbake.
hvilket format body-en er i, og hvilken kopi av den dette er
Kontrollheadere
begge, om forbindelsen
Cache-Control, Connection, Via, Transfer-Encoding
hvordan meldingen og forbindelsen håndteres underveis
Noen headere er klart ensrettede: If-None-Match gir bare mening i en forespørsel, og Set-Cookie bare i et svar. Å tolke i feil retning er en av de klassiske kopier-og-lim-inn-feilsøkingsfeilene, og det er derfor denne siden markerer det.
Grammatikken til en headerlinje
RFC 9110 definerer en feltlinje som field-name ":" OWS field-value OWS — et navn bare av tokentegn (bokstaver, siffer og !#$%&'*+-.^_`|~), et kolon med ingen mellomrom foran det, og en verdi av synlige tegn, mellomrom og tabulatorer. Header-navn skiller ikke store og små bokstaver (content-type er det samme som Content-Type); verdier er nesten alltid store/små-bokstavsfølsomme. En linje som starter med mellomrom eller tabulator fortsatte tidligere forrige header — obs-fold, utdatert siden 2014: en proxy som folder den ut kan endre hva headeren betyr, så parseren her slår den sammen, men varsler om at den finnes.
Vanlige feil
Å stole på X-Forwarded-For. Den legges til av hver proxy på veien, og en klient kan forfalske det første hoppet. Den forteller hva en kjede av proxyer hevder, ikke hvem som er koblet til; behandle den som et hint, og foretrekk en proxy man kontrollerer som overskriver den.
Å lese bare svarheaderne. Halvparten av de interessante feilene (en dupliseret Accept, en manglende Host, en autorisasjonsheader rettet mot feil vert) ligger i forespørselen, som nettleseren skjuler som standard. Bruk Kopier som cURL for å se sin egen.
Sammenslåing av Set-Cookie-linjer. De fleste dupliserte headere kan slås sammen med komma — Set-Cookie må ikke, fordi komma finnes inni selve verdien. Nettlesere behandler hver linje som en egen informasjonskapsel.
Å tro at Content-Length er størrelsen på body-en man skrev. Den er størrelsen etter at Content-Encoding er brukt, og bare når meldingen ikke er chunked; et Transfer-Encoding: chunked-svar har ingen meningsfull enkeltlengde.
Å bedømme headere etter X--prefikset. Konvensjonen døde med RFC 6648: X-Forwarded-For og X-Content-Type-Options er varige de facto-standarder, mens mange ikke-X-headere er eksperimentelle. Døm etter det definerende dokumentet, ikke prefikset.
Ofte stilte spørsmål
Er det trygt å lime inn headere her? Tolkingen skjer helt i nettleseren, og ingenting lastes opp. Likevel er en kopiert headerblokk et fingeravtrykk: informasjonskapsler, autorisasjonsheadere og den nøyaktige User-Agent-en kan sammen identifisere en person, så tolk bare blokker man ikke ville hatt noe imot å vise en kollega.
Hvorfor viser nettleseren headere som :status som denne siden kaller feil? Det er HTTP/2- og HTTP/3-pseudoheadere — de binære rammelagene erstatter startlinjen og Host med pseudofelt. Denne siden tolker den klassiske HTTP/1.1-tekstlinjen; pseudoheadere er den samme informasjonen etter at protokollen har oversatt den.
Hva skjedde med X-XSS-Protection? Den er utdatert: revisoren den drev skapte egne sikkerhetsfeil, og nettlesere har fjernet den. Jobben dens hører hjemme i en Content-Security-Policy — lag en med CSP-generatoren og kontroller hele settet på sjekkeren for sikkerhetsheadere.
Hvordan kontrolleres et Set-Cookie-attributt? Mot RFC 6265: navn og verdier deles ved det første likhetstegnet, attributter etter det første semikolonet, Expires må være en dato i informasjonskapselformatet, Max-Age må være sifre, og SameSite må være Strict, Lax eller None — og None uten Secure avvises av nåværende nettlesere, så det pekes ut.
Kan man bare tolke en liste med headerlinjer? Ja — velg Bare headerblokk og lim inn uten startlinje. Retningskontrollene er mildere; alt annet (struktur, Set-Cookie, parametere) kjører fortsatt.