HTTP/2 and HTTP/3 Through a Proxy: What Actually Reaches the Server and Why QUIC Won't Pass
Picture a scenario that stumps even experienced engineers. You open a website directly in your browser and see a proud h2 in the developer panel — the connection is running over HTTP/2. Then you route the same request through a proxy and, to your surprise, the server responds with good old HTTP/1.1. Where did the second version of the protocol go? Why does the proxy seem to have rolled you back in time? And, most intriguingly, why does HTTP/3, which runs on top of QUIC, flat-out refuse to traverse a standard proxy, as if hitting an invisible wall?
This article is an exhaustive deep dive into the transport layer when working through a proxy. We won't touch on connection fingerprints or automation detection. Our focus is pure mechanics: what actually reaches the server, where protocol version negotiation happens, why UDP transport is incompatible with a classic proxy, and how to make a deliberate version choice. By the end, you'll understand this topic at a level that lets you debug even the most convoluted network scenarios.