The toy parser splits two query pairs in order.

highlighted = computed this step

The toy parser splits two pairs

The query rows keep q first and page second.

two query pairs\text{two query pairs}
Query pair splitThe query bytes, parsed pairs, and empty body check are recomputed from pinned GET bytes.Query pair split - 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

q chooses cat

The first pair row is q=cat.

q=cat\text{q}=\text{cat}
Query pair splitThe query bytes, parsed pairs, and empty body check are recomputed from pinned GET bytes.Query pair split - 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

page chooses two

The second pair row has page value 2.

page=2\text{page}=2
Query pair splitThe query bytes, parsed pairs, and empty body check are recomputed from pinned GET bytes.Query pair split - 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

The two choices come from the query string, not from headers.

pairs parsed in order\text{pairs parsed in order}
Query pair splitThe query bytes, parsed pairs, and empty body check are recomputed from pinned GET bytes.Query pair split - 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