Incoming HTTP Request
│
├── [1] RouterOnRequestHandler hooks ← can set headers here
│ (before auth, before request parsing)
│
├── [2] graphqlPreHandler ← parses, authenticates, validates, plans
│
├── [3] RouterMiddlewareHandler hooks ← can set headers here
│ (after parse/auth, ctx.Operation() available)
│
├── [4] graphqlHandler.ServeHTTP
│ ├── SubgraphHeadersBuilder() ← HEADER HASHES COMPUTED HERE
│ │ (reads current request headers, applies forwarding rules, hashes result)
│ │
│ └── Engine Resolver
│ ├── Inbound Request Deduplication (uses allHash from step [4])
│ └── Per-subgraph fetches:
│ ├── Subgraph Request Deduplication (uses per-subgraph hash from step [4])
│ ├── ────────────────────────────
│ ├── EnginePreOriginHandler hooks ← TOO LATE for dedup key
│ ├── ────────────────────────────
│ ├── HTTP transport (circuit breaker, retry, actual fetch)
│ └── EnginePostOriginHandler hooks
│
└── Response to client