The Host header stays separate from the query string.

highlighted = computed this step

Host remains a header

The Host row is separate from the request target.

Host header\text{Host header}
Query Host headerThe request target, query rows, Host header, and empty body check are recomputed from pinned bytes.Query Host header - GET /search query q=cat and page=2, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linetarget displaypath /search question q=cat ampersand page=2safe display formrequest lineversionHTTP/1.1parsedheaderHostsearch.exampleexacttargetpath/searchbefore question markquerydisplay wordsq=cat ampersand page=2safe display formqueryexact hex713d63617426706167653d32pinned bytespairqq=catparsedpairpagepage=2parsedcheckbody bytes0after blank linecheckhas bodynotoy GET

The pinned host is search.example

The Host header value is search.example.

Host=search.example\text{Host}=\text{search.example}
Query Host headerThe request target, query rows, Host header, and empty body check are recomputed from pinned bytes.Query Host header - GET /search query q=cat and page=2, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linetarget displaypath /search question q=cat ampersand page=2safe display formrequest lineversionHTTP/1.1parsedheaderHostsearch.exampleexacttargetpath/searchbefore question markquerydisplay wordsq=cat ampersand page=2safe display formqueryexact hex713d63617426706167653d32pinned bytespairqq=catparsedpairpagepage=2parsedcheckbody bytes0after blank linecheckhas bodynotoy GET

Headers are not query pairs

The query pairs live in the target. Host stays in the header section.

headers separate\text{headers separate}
Query Host headerThe request target, query rows, Host header, and empty body check are recomputed from pinned bytes.Query Host header - GET /search query q=cat and page=2, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linetarget displaypath /search question q=cat ampersand page=2safe display formrequest lineversionHTTP/1.1parsedheaderHostsearch.exampleexacttargetpath/searchbefore question markquerydisplay wordsq=cat ampersand page=2safe display formqueryexact hex713d63617426706167653d32pinned bytespairqq=catparsedpairpagepage=2parsedcheckbody bytes0after blank linecheckhas bodynotoy GET

Summary

A GET request can carry choices in the target while keeping headers separate.

target and headers split\text{target and headers split}
Query Host headerThe request target, query rows, Host header, and empty body check are recomputed from pinned bytes.Query Host header - GET /search query q=cat and page=2, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linetarget displaypath /search question q=cat ampersand page=2safe display formrequest lineversionHTTP/1.1parsedheaderHostsearch.exampleexacttargetpath/searchbefore question markquerydisplay wordsq=cat ampersand page=2safe display formqueryexact hex713d63617426706167653d32pinned bytespairqq=catparsedpairpagepage=2parsedcheckbody bytes0after blank linecheckhas bodynotoy GET