Servers & frameworks (inbound)72 rows
Stacks that accept or route QUERY.
| Stack | Lang | Status | ★ Stars | PR / issue | Days after RFC | Notes |
|---|---|---|---|---|---|---|
| Next.js | TypeScript | PR open | 142,090 | PR #97561 — open | +64 · out of draft by +80 | QUERY as a Route Handler method export; the PR is no longer a draft and is being kept rebased with tests passing (+80), but no maintainer has reviewed it yet |
| Go (net/http) | Go | Accepted & landed | 137,502 | Issue #80058 — closed completed · PR #80134 — open | +2 issue · likely accept +65 · accepted +72 | MethodQuery proposal accepted and closed (+72); MethodQuery = "QUERY" // RFC 10008 is on master (Go 1.28 dev cycle). Community PR #80134 idle since +31 |
| Node.js (core) | JS / C++ | Shipped | 120,619 | v21.7.2 release (llhttp 9.2.0) | −804 | Earliest shipper (parse/route QUERY); llhttp reclassified QUERY from experimental to standardized (llhttp#868, merged +44, llhttp 9.4.3) |
| Deno | Rust / TS | Open | 108,367 | Issue #36186 — open | +34 | Feature request; Deno.serve may accept method string; idle since +36 |
| FastAPI | Python | Tracked (discussion) | 102,077 | Discussion #15839 — open | +9 · active +78 | No issue/PR, but the discussion moved on both blockers this week. The ASGI layer underneath, Starlette, merged QUERY at +75, and FastAPI pins starlette>=0.46.0, so that half is done. What remains is doc generation: Swagger UI now supports OpenAPI 3.2, but FastAPI's fallback UI ReDoc 2 is gated on 3.1 and would not classify query as an operation at all. FastAPI still says it tracks this internally and will implement "once we have time". Reported in issue #7 |
| Bun | Zig / TS | Works (generic) | 95,879 | Issue #34839 — closed | +34 | Bun.serve + body verified; not full RFC semantics |
| Gin | Go | PR open | 89,172 | PR #4806 — open · Issue #4721 — open | +59 · issue +13 | First-class router.QUERY support; the branch is kept green (+80) but there has been no review comment since +59 — the contributor had to open a separate dependency-bump PR to clear pre-existing Trivy failures on master before CI would go green. Ecosystem: gin-contrib/cors#192 (QUERY in DefaultConfig) still open, unreviewed since +73 |
| Django | Python | PR in review | 89,934 | PR #21855 — open · Trac #37232 — accepted, assigned · new-features #186 — reopened | ticket +39 · accepted +40 · PR +74 · active +79 | The contributor's fork became a real PR against django/django at +74 and is drawing fellow review (+78–79). Design as accepted: QUERY content is exposed via HttpRequest.body and deliberately not parsed (the same treatment as PUT), leaving DEP 17 parsing room; the diff reaches admin, auth admin, the common/CSRF/conditional-GET middleware, utils.cache, the HTTP view decorators and the test client. The live scope question is whether cache/Vary support must land in the same PR or a follow-up ticket — a second contributor has offered to write it either way. DRF work is being prototyped separately. Reported in issue #6 |
| Elasticsearch | Java | Declined | 77,890 | Issue #153255 — closed not planned · PR #153257 — closed | +22 | QUERY /{index}/_search proposed and declined by a maintainer: the value is intermediary caching, "not something we see users doing in practice", and correct caching is hard when bodies contain now. Explicitly left open to reconsider later |
| NestJS | TypeScript | Released | 76,571 | PR #17162 — merged · v11.2.0 | +3 · merged & released +59 | QUERY routing in core + Express/Fastify platforms; carried into v12.0.0 (+72); e2e tests #17310 merged. The satellite packages are still catching up: the OpenAPI module PR is separate (see Specs) and the HTTP module has an unreviewed PR (nestjs/axios#1785, +76) |
CPython (http.server) | Python / C | Open | 75,977 | Issue #153309 — open · PR #155786 — open | +22 · new PR +59 | Stdlib HTTP support / method constant; original PR #153310 closed unmerged, picked up fresh by a new contributor (+59), quiet since |
| Flask | Python | Merged (3.2.0) | 72,166 | Issue #6065 — closed completed · PR #6133 — merged | +7 · merged +56 | app.query() route decorator is in the unreleased 3.2.0 changelog (latest release is 3.1.3); Werkzeug test-client Client.query() merged too (#3219, +44, also unreleased); flask-cors QUERY-by-default PR now a draft (#413, +62) |
| Express | JavaScript | Works | 69,417 | Issue #5615 — closed completed | −787 | Works on QUERY-capable Node |
| Spring MVC / WebFlux | Java | Merged (unreleased) | 60,221 | PR #34993 — closed, applied by maintainer | −378 · revived +15–17 · merged +65 | RequestMethod.QUERY / @RequestMapping support is on main — but not in v7.1.0-M1 (tagged the same day, +65), and no milestone has been cut since, so 15 days on there is still no build carrying it. Convenience @QueryMapping / @QueryExchange / DSL follow-up #37185 closed (+66): enhancements considered "one by one" as adoption shows |
| Rails | Ruby | Merged (8.2) | 58,751 | PR #57973 — merged (forum) | ~+6 → PR +17 · merged +59 | Merged to main by rails core, milestone 8.2.0 (no 8.2 release yet); routing-assertion follow-up #58623 merged +79, so method: :all now exercises PATCH and QUERY too. Active Resource added a client-side QUERY as well (activeresource#476, merged +67) |
| PHP (CLI server) | PHP / C | Merged | 40,360 | PR #22615 — merged | +20 · merged +22 | Built-in dev server accepts QUERY (was 501) |
| Fiber | Go | Released (v3) | 40,125 | PR #4436 — merged · #4456 completion · #4459 cache body keys | +2 · merged +9 | Early full adopter: routing, completion follow-up and QUERY cache body-key hashing all merged to main (v3); v3.4.0 tagged +16, v3.5.0 +58; tracking proposal #4512 closed completed (+58) |
| ASP.NET Core | C# | Preview | 38,418 | PR #65714 — shipped in 11 Preview 4 · Issue #68331 — open | −35 | Server + OpenAPI operation type; original issue #61089 closed completed (+49); MapQuery/attribute-routing follow-up filed +55, still open and active (+71) |
| Fastify | JavaScript | Released | 37,089 | PR #6832 — merged · closes #6807 | +5 · merged +30 · release +44 | First-class QUERY routing; shipped in v5.11.0 and carried through the v5.12.x line and the new v6.0.0-alpha series (+80); empty-body fix #6929 still open (+54, active +80), and a PR documenting the fastify.query() shorthand opened at +77 (#7004) |
| Laravel (routing) | PHP | Merged for L14 | 34,893 | PR #60655 — merged to master; #60810 closed | +20 | Route::query() on master → ships with Laravel 14; client helper separate (13.x) |
| Hono | TypeScript | Released | 32,088 | PR #5070 — merged · v4.13.0 | +16 · release +48 | First-class app.query() routing; QUERY-aware ETag (#5111), CORS (#5115) and cache (#5119) all in v4.13.0; zod-openapi middleware QUERY support merged (middleware#2086, +58) |
| Axum | Rust | Merged (main) | 27,014 | Issue #3799 — closed completed · PR #3801 — merged | 0 / +1 · merged +48 | MethodFilter::QUERY, routing::query[_service], MethodRouter::query[_service] in the unreleased changelog; still no release (latest 0.8.9, Apr 2026). Ecosystem: axum-test QUERY support merged (#211, +65) |
| Vapor | Swift | Approved, unblocked | 26,190 | PR #3489 — open, approved | +42 · approved +43 · unblocked +79 | Router QUERY methods; the merge was held for swift-http-types 1.7.0, which shipped at +79 with "Make QUERY method public" (swift-http-types#130). The blocker is gone and the PR is approved — it has simply not been touched since +73. Upstream SwiftNIO still has its own open PR (see Clients) |
| Actix Web | Rust | PR open | 24,818 | PR #4140 — open | +22 · touched +76 | QUERY added to the framework's method handling; branch kept current but no maintainer review yet |
| fasthttp | Go | Merged | 23,461 | PR #2358 — merged | +60 · merged +73 | High-performance server + client lib; the maintainer merged QUERY method support 13 days after it opened, with a one-word review. No tagged release carries it yet (latest v1.73.0, +41) |
| Phoenix | Elixir | PR open | 23,139 | PR #6737 — open | +9 · active +60 | Router QUERY support; the Plug layer underneath already merged it (see Plug row) |
| chi | Go | Merged | 22,778 | Issue #1122 — closed completed · PR #1132 — merged | +17 · merged +19 · release +20 | QUERY added to the router's method set; landed two days after the first request (an earlier attempt, #1129, was superseded) and tagged in v5.3.1 the next day — the fastest request-to-release turnaround in the tracker |
| Tornado | Python | PR open (2nd try) | 22,176 | PR #3675 — open · PR #3697 — closed | +18 · second PR closed +42 | The first PR (+18) is still open and untouched; a competing PR was opened and closed the same day (+42). No maintainer response on either |
| GoFr | Go | In review | 20,952 | PR #3760 — open · Issue #3756 — open | +38 · active +80 | App.QUERY routes + client Query. A second maintainer review at +78 requested more changes — case-insensitive Content-Type matching, and one shared "which media types can Bind decode" list instead of two that drift — and the author is turning each round around the same day. Still moving at +80, the most actively reviewed open QUERY PR in the tracker |
| SvelteKit | TypeScript | Merged (v3) | 20,778 | PR #16782 — merged (version-3) | +58 | QUERY handlers in +server.js; ships with SvelteKit 3 (still 3.0.0-next.*). Sentry's SvelteKit SDK added a QUERY e2e test (sentry-javascript#23501, merged +69) |
| Elysia | TypeScript | PR open | 19,074 | PR #1938 — open | +25 | QUERY routing for the Bun-first framework; no review yet |
Nim (std/asynchttpserver) | Nim | PR open | 18,215 | PR #25933 — open | +7 · active +72 | QUERY in the stdlib HTTP method type (server + client); one of the earliest post-RFC PRs anywhere and still moving |
| aiohttp (server) | Python | Released | 16,532 | Issue #13160 — closed · PR #13174 — merged | +30 · merged +34 | C parser recognizes QUERY; shipped in 3.14.2 (+34); METH_QUERY + idempotent classification merged for 3.15 (#13301, +48; backport +56; 3.15 still not out, latest 3.14.3) |
| hapi | JavaScript | PR open | 14,792 | PR #4588 — open | +70 | Types-level fix adding QUERY to the accepted method union; runtime routing on QUERY-capable Node is a separate question |
| Vert.x (core) | Java | Merged | 14,684 | PR #6212 — merged | +2 · merged +20 | HttpMethod.QUERY in core, merged fast; the Vert.x Web router PR on top is still in review (see below) |
| Yii2 | PHP | PR open | 14,297 | Issue #21062 — open · PR #21063 — open | +59 · PR +61 · active +70 | Framework QUERY support; QUERY method constant tracked separately in yiisoft/http (#70 / PR #71, +59) |
| OpenSearch | Java | PR open | 13,656 | Issue #22409 — open · PR #22410 — open | +22 · active +37 | QUERY /{index}/_search, the same proposal Elasticsearch declined — here it is still live |
| Play Framework | Scala / Java | PR open | 12,617 | PR #14072 — open | +21 · active +36 | Router + request handling; the standalone client library already merged its half (play-ws#1366, +69) |
| Starlette | Python | Merged (unreleased) | 12,592 | PR #3489 — merged · #3370 / #3343 — closed unmerged | +75 | The ASGI layer under FastAPI — QUERY accepted in routing and method handling. The maintainer landed his own branch on main the day it was opened (+75) and closed the two community PRs (+9 routing, +20 test client) in its favour. Removes the ASGI-side blocker for FastAPI; not in a release yet (latest 1.6.0, +53) |
| Slim | PHP | Merged (v5) | 12,276 | PR #3467 — merged (v5) · PR #3461 — open (4.x) | v5 merged +70 · 4.x PR +43 | query() route method landed on the v5 branch (+70). The 4.x backport is still open: the maintainer's objection was that adding query() to RouteCollectorProxyInterface breaks BC, and he resolved it himself by pushing a @method docblock annotation instead (+67) — but 4.15.3 shipped at +77 without it |
| gqlgen | Go | Open | 10,759 | Issue #4295 — open | +66 | GraphQL server library tracking QUERY (natural fit for GraphQL-over-HTTP reads); no PR yet |
| Frappe | Python | Merged | 10,697 | Issue #40797 — closed completed · PR #41135 — merged | +26 · merged +35 | Merged to develop |
| Grape | Ruby | Merged | 10,004 | PR #2887 — merged | +78 · merged +78 | Ruby's main REST-API DSL merged QUERY the day it was opened; the maintainer's note — "I'm excited to beat Rack and Rails on QUERY support" — is accurate, since Rails' merge is still unreleased |
| Django Ninja | Python | PR open | 9,180 | PR #1754 — open | +57 · active +62 | @api.query() operation support; still ahead of Django core, whose own PR only opened at +74. v1.7.0 shipped at +75 without it — the PR has been quiet since +62 |
| Tomcat | Java | Committed (12.x) | 8,240 | PR #1026 — closed unmerged; reimplemented by committer | +15 | Landed by hand "based on PR #1026… with a few minor variations"; Tomcat 12 only (needs Servlet API change) |
| Micronaut | Java | Merged | 6,424 | Issue #12772 — closed completed · PR #12780 — merged | +16 · merged +31 | QUERY across the server and declarative-client surfaces; requested at +16, merged 15 days later |
| h3 | TypeScript | Released (v2 rc) | 5,417 | Issue #1441 — closed completed · PRs #1445 / #1446 / #1447 | +21 · shipped +23 | The HTTP layer under Nitro/Nuxt: QUERY in HTTPMethod, plus requireContentType and appendAcceptQuery utils; released in v2.0.1-rc.24 |
| Armeria | Java | Merged | 5,137 | PR #6861 — merged | +31 · merged +48 | Server + client surfaces; released and carried forward through 1.41.0 (+52) and 1.41.1 (+77) |
| Jetty | Java | Open | 4,092 | PR #15316 — open | +5 | Targeted at Jetty 13.0.x (not 12.x); no discussion since +29, but touched again +65 |
| Kemal | Crystal | Released (1.13.0) | 3,914 | Issue #762 — closed · PR #769 — merged | +13 · merged +59 · release +69 | query route DSL, Kemal::Router#query and filters shipped in v1.13.0 (+69) — one of the first frameworks to go from merge to tagged release. The surrounding ecosystem followed within a week: a query helper in spec-kemal and docs both merged +75. Crystal stdlib client PR separate (see Clients) |
| Helidon | Java | Maintainer taking over | 3,817 | PR #12178 — open · Issue #12174 — open | +29 · handover +79 | Oracle's microservices framework; WebServer + WebClient QUERY support. The contributor was stuck for weeks on Oracle's contributor agreement (the OCA download 404s outside the US), and at +79 a Helidon maintainer said he will take the work over — rebasing onto a PR of his own with the contributor kept as co-author, because it touches "quite a critical part of the system" — then close #12178 |
| Undertow | Java | Nothing | 3,759 | none found | n/a | Servlet container (Spring Boot option); no RFC tracking found |
| Plug | Elixir | Merged | 3,014 | PR #1319 — merged | +9 | Among the earliest post-RFC merges; the HTTP layer under Phoenix (whose router PR is still open) |
| Reactor Netty | Java | PR open | 2,777 | PR #4283 — open | +21 · active +67 | The reactive HTTP layer under Spring WebFlux; server + client QUERY support |
| http4s | Scala | PR open | 2,626 | PR #7892 — open | +24 | QUERY for the Scala server/client stack; no review yet |
| Mercurius | JavaScript | PR open | 2,487 | PR #1265 — open | +67 | GraphQL server for Fastify — GraphQL-over-HTTP reads over QUERY, following Fastify's released routing |
| Wolverine | C# | Merged | 2,330 | PR #3296 — merged | +19 · merged +19 | .NET messaging / HTTP framework; QUERY verb support in Wolverine.HTTP merged the day it was opened — one of the earliest .NET-side adopters, well ahead of ASP.NET Core's own MapQuery follow-up |
| Tempest | PHP | Open | 2,262 | Issue #2264 — open | +73 · active +79 | Report that the framework's default dev server — PHP's built-in server — refuses QUERY, so the method cannot be exercised locally. php-src's fix is merged but unreleased, so the maintainer is waiting on PHP 8.6 and has accepted a docs entry in the meantime; a contributor suggests the FrankenPHP/Caddy image as a workaround |
| Azure Functions | C# | Open | 2,021 | Issue #11865 — open | +22 | QUERY in HTTP triggers; the Python worker library merged its side already (azure-functions-python-library#350, +36) |
| Servant | Haskell | PR open | 1,967 | Issue #1900 — open · PR #1907 — open | +28 · PR +57 · active +69 | Type-level QUERY verb; upstream http-types still lacks the constant (only a small fork merged it, Vlix#34, +64) |
| reitit | Clojure | Merged | 1,581 | PR #786 — merged | +7 · merged +76 | Data-driven router for Clojure/Script; QUERY method added, documented and tested. One of the earliest post-RFC PRs anywhere, it sat 69 days before a maintainer put it "in mergeable shape" himself and merged it (+76) |
Koa (@koa/bodyparser) | JavaScript | PR open | 1,325 | PR #177 — open | +58 | Parse QUERY request bodies; routing already works on QUERY-capable Node (http.METHODS) |
| Vert.x Web | Java | In review | 1,150 | PR #2921 — open | +21 · active +78 | Router layer on top of the merged core support; the maintainer is engaged but says he cannot explain why this PR's CI hangs while master's passes, and the branch is already rebased — stuck there since +72 |
| APIFlask | Python | Completed | 1,136 | Issue #753 — closed completed | +13 · closed +57 | Flask-based API framework with built-in OpenAPI; QUERY support tracked and closed out ahead of Flask's own 3.2.0 release |
| Comunica | TypeScript | Merged | 580 | PR #1778 — merged | +77 · merged +77 | Knowledge-graph / SPARQL query engine for JavaScript — merged same-day with full patch coverage. Directly relevant to the LWS work above: it is the query layer many Solid apps sit on, and it moved before the SPARQL protocol spec did |
| Jakarta REST (JAX-RS) | Java (spec) | No consensus, volunteer waiting | 400 | Issue #1345 — open | +3 · revived +79 | A committer offered to implement but reported "no majority in team for adopting QUERY yet", arguing Jakarta REST is independent of the Servlet change. After 62 silent days a new contributor volunteered at +79 for the whole scope — @QUERY annotation and HttpMethod.QUERY, query(Entity) on SyncInvoker/AsyncInvoker/RxInvoker, plus spec text and TCK tests — and asked to be assigned. No committer has answered yet, and the underlying vote has not changed |
| Hanami | Ruby | Merged | 361 | PR #307 — merged | +64 · merged +80 | Conditional QUERY support in the router, merged without discussion 16 days after it opened — the third Ruby router to land QUERY after Rails and Grape |
| Jakarta Servlet | Java (spec) | Completed | 325 | Issue #1068 — closed completed · #1069 | +9 · closed ≤+34 | Spec-level container contract (Servlet 6.2); cited by the Tomcat 12 work |
| GenHTTP | C# | Open | 286 | Issue #867 — open | +13 · active +78 | Embeddable pure-C# web server; QUERY verb request filed two weeks after the RFC and picked back up at +78 |
| Marko Run | TypeScript | Released | 175 | PR #275 — merged · #279 release fix | +59 · merged +62 · released +63 | Marko's application framework; +query route handlers merged and deliberately shipped as a patch while the project is pre-1.0, with the docs updated alongside (website#277, +66) |
| Lilya | Python | Merged | 67 | PR #417 — merged | +19 · merged +19 | ASGI toolkit; merged QUERY the day it was opened — 56 days before Starlette, the layer it competes with, landed the same feature |
| W3C LWS | Spec | Merged, contested | 30 | PR #179 — merged · Issue #205 — open | +10 · merged ≈+34 · issue touched +76 | QUERY for Search / Type Index; the GET/POST fallback must resolve before CR, and an editor's position at +66 is that they are "monitoring the state of QUERY adoption before deciding to make changes to the requirements and/or fallback methods in the type index" — i.e. this tracker's own subject is the gate. Solid ecosystem is beginning to follow: CommunitySolidServer/access-token-verifier#324 added QUERY to its allowed request methods (merged +72) |
Clients (outbound)48 rows
Stacks that send QUERY.
| Stack | Lang | Status | ★ Stars | PR / issue | Days after RFC | Notes |
|---|---|---|---|---|---|---|
| Go (net/http) | Go | Accepted & landed | 137,502 | Issue #80058 — closed completed · Issue #80488 — closed completed | +2 · accepted +72 · fix +64 | NewRequest("QUERY", …) works; MethodQuery constant now on master; §2.5 redirect fix (CL 803520) landed (+64) |
Deno (fetch) | Rust / TS | Open | 108,367 | Issue #36186 — open | +34 | Feature request; method string may already work; idle since +36 |
Bun (fetch / node:http) | Zig / TS | Works (generic) | 95,879 | Issue #34839 — closed | +34 | Client + body verified |
CPython (http.client) | Python / C | Open | 75,977 | Issue #153309 — open · PR #155786 — open | +22 · new PR +59 | Stdlib client / method constant; replacement PR after #153310 closed (+59) |
| Spring RestClient / WebClient | Java | Merged (unreleased) | 60,221 | Framework-wide PR #34993 — applied (+65) | −378 → merged +65 | Core QUERY support merged with the server work but absent from v7.1.0-M1; @QueryExchange / client DSL shortcuts deferred (#37185 closed +66) |
| requests | Python | Watching adoption | 54,279 | Issue #7574 — open · #7558 — closed not planned · PR #7577 — closed unmerged | +23 open issue · +18 / +24 closed | Not a flat refusal: a maintainer confirms requests.request("QUERY", …) already works and the redirect caveat is "relatively trivial to handle", but declines to commit to a formal requests.query() API until server-framework implementations and real adoption rates are visible — "a formalized API is a long-lived maintenance contract that if we rush into is a net-negative". Explicitly revisitable. Reported in issue #5 |
| Cypress | JavaScript | Released | 51,022 | PR #34459 — merged · in v15.20.0 | +47 · merged +48 · release +49 | cy.request() / cy.intercept() QUERY support; 2023-era issue #28282 closed completed; follow-up #34576 merged +57 |
| curl | C | Generic | 42,753 | none needed | n/a | -X QUERY works today |
Laravel Http::query() | PHP | Merged | 34,893 | PR #60663 — merged | +17 | Client helper on 13.x (routing separate, L14) |
| Symfony HttpClient | PHP | Merged (8.2) | 31,143 | PR #64874 — merged | +25 · merged +58 | CachingHttpClient QUERY support (body-aware) on the 8.2 branch; arbitrary methods already worked; the docs issue (symfony-docs#22642) closed completed at +72 |
| Guzzle | PHP | Works + redirects | 23,460 | Issue #3699 — closed · PR #3702 — merged | +8 | Method string + redirect middleware fixed for QUERY |
JDK HttpClient (java.net.http) | Java | Minor internal semantics changes outstanding | 23,321 | JDK-8276958 | n/a | Java 11+; HttpRequest.newBuilder().method("QUERY", body) — arbitrary methods with body; JBS ticket untouched since Jan 2025 |
Crystal (HTTP::Client) | Crystal | PR open | 20,399 | PR #17265 — open | +64 · active +77 | Stdlib client query method; pairs with Kemal's released server support, and is now the gap between Crystal apps and the Kemal/OWASP-Noir side of the ecosystem that already ships QUERY |
.NET HttpClient (System.Net.Http) | C# | API approved | 18,239 | Issue #113522 — open, API approved · #132092 — open · #130671 — closed duplicate | −459 proposal · approved +56 | QueryAsync surface passed .NET API review (+56); JSON extension methods split out to #132092 (+55); arbitrary methods already work via HttpRequestMessage |
| aiohttp (client) | Python | Released | 16,532 | Issue #13160 · PR #13174 — merged | +30 · +34 | Shared parser fix benefits client + server; shipped in 3.14.2; METH_QUERY + idempotent treatment merged for 3.15 (+48) |
| hyper | Rust | Via http | 16,302 | inherits hyperium/http#798 | 0 | Low-level client/server; http::Method::QUERY, released in http v1.5.0 (+43) |
| httpx | Python | Unmaintained | 15,460 | none found | n/a | Arbitrary methods usually work, but the project is unmaintained — no release since 2024. pydantic's httpx2 fork (below) is its QUERY-capable successor; see issue #4 |
| dio | Dart | Released | 12,840 | PR #2557 — merged | +27 · merged +28 | Dart/Flutter's dominant HTTP client: query() and queryUri() helpers, released in dio 5.11.0 (+39) |
| reqwest | Rust | Declined | 11,807 | Issue #3056 — closed not planned | 0 | High-level async (on hyper); uses http crate methods |
| resty | Go | Merged | 11,775 | PR #1187 — merged | +35 · merged +38 | Merged to the v3 branch; not in a tagged release yet (latest v3.0.0-rc.3, +23) |
| OpenFeign | Java | Released (13.14) | 9,798 | PR #3454 — merged | +11 · merged +42 · release +64 | Declarative Java client; 13.14 ships QUERY in the method template and teaches HttpCacheInterceptor to treat QUERY as cacheable with a body hash in the cache key |
| JMeter | Java | Open | 9,527 | Issue #6743 — open | +42 | HTTP sampler method list; to-triage, no PR yet |
| SwiftNIO | Swift | PR open | 8,511 | PR #3654 — open | +23 · touched +28 | HTTPMethod.QUERY definitions; idle since +28. Now the last unmerged piece of the Swift stack — swift-http-types made QUERY public in 1.7.0 (+79) and Vapor's PR is approved and waiting |
| Node.js / undici | JavaScript | Shipped | 7,687 | Issue #5454 · PR #5459 — merged | +11 / +13 · npm 8.6.0 at +16 | Node's fetch implementation; body-aware cache key work |
| REST Assured | Java | Open | 7,141 | Issue #1872 — open | +26 | Java test DSL; request for a native query() alongside get()/post(). No maintainer response |
| ofetch | TypeScript | Two PRs open | 5,353 | PR #611 — open · PR #623 — open · Issue #610 — open | +30 · second PR +61 | QUERY as payload-bearing method; two competing PRs, neither reviewed; sibling ocache PR closed unmerged (#31, +63) |
| req | Go | Merged | 4,857 | PR #508 — merged | +35 · merged +44 | Query / MustQuery helpers |
| urllib3 | Python | Nothing | 4,054 | none found | n/a | Underpins many Python clients |
| Kiota | Multi | Open, scoped | 3,815 | Issue #8126 — open | +78 · active +78 | Microsoft's OpenAPI client generator. A maintainer engaged the same day: most language bindings model the HTTP method as an enum, so arbitrary verbs would be a source-breaking change — the agreed plan is to add QUERY as an enum member across the per-language abstractions first, release those packages, then teach the generator. Custom verbs deferred |
| Saloon | PHP | PR open | 2,438 | PR #556 — open | +26 · touched +32 | API-integration SDK builder; QUERY as a body-carrying method |
| ureq | Rust | Open | 2,180 | Issue #1177 — open | +6 (Jun 22) | Blocking client; request for ureq::query / Agent::query; idle |
| Tesla | Elixir | Merged | 2,078 | PR #896 — merged | +20 · merged +23 | Elixir's middleware-based client; shipped in the v1.21 line |
| Apache HttpClient 5 | Java | In 5.7-alpha1 | 1,534 | PR #840 — merged · PR #852 — merged | +15 method · cache +36 · alpha +58 | Method/redirect support released in 5.7-alpha1, tagged rel/v5.7-alpha1 at +58; body-keyed HTTP cache (#852) missed the alpha1 cut — next release |
| sttp | Scala | PR open | 1,504 | PR #2948 — open | +29 | Client API PR still unreviewed; the shared model already merged (sttp-model #465, +27, in v1.7.18) |
| hackney | Erlang | Merged | 1,417 | PR #896 — merged | +18 · merged +18 | First-class QUERY in Erlang's most-used HTTP client; merged the day it was opened, in the 4.7.x line |
| Active Resource | Ruby | Merged | 1,405 | PR #476 — merged | +20 · merged +67 | Rails' REST object mapper; merged to main, no release since 2025 |
Rust http crate | Rust | Released | 1,379 | PR #798 — merged · closes #743 | 0 · release +43 | Method::QUERY; safe + idempotent. v1.5.0 unblocked axum + hyper downstream |
| httpx2 | Python | Released | 1,340 | PR #1055 — merged · v2.6.0 | +28 | pydantic's maintained fork / successor of httpx and the natural migration path for httpx users who need QUERY — already ~a quarter of httpx's downloads and climbing (pypistats), and its star count grew 24% in the last week alone; QUERY merged & released same day in v2.6.0 |
| retrofit.dart | Dart | Merged | 1,184 | Issue #922 — closed completed · PR #926 — merged | +34 · merged +58 | Generator QUERY support merged by the maintainer (+58); duplicate PRs #924/#925 closed; a dedicated Dart QUERY SDK (http_query) also exists — see Purpose-built projects |
| isahc | Rust | Nothing | 789 | none found | n/a | libcurl-backed; custom methods typically work |
| Chopper | Dart | Merged | 749 | PR #722 — merged | +26 · merged +29 | Source-generated Dart client; QUERY alongside the other verbs |
| attohttpc | Rust | Nothing | 294 | none found | n/a | Lightweight blocking; no RFC tracking found |
Gleam http | Gleam | Open | 284 | Issue #81 — open | +20 · active +75 | The language's shared client/server HTTP types; QUERY has to land here before any Gleam framework can route or send it |
| Inrupt solid-client (JS) | TypeScript | Nothing | 244 | none found | n/a | Solid data client; needed once pods speak QUERY |
| libwww-perl | Perl | Bug open | 211 | Issue #530 — open | +35 | LWP::UserAgent downgrades QUERY→GET on 302, contrary to RFC 10008 §2.5. The message layer beneath it did add QUERY (HTTP-Message#225, merged +38), so the remaining gap is the user agent's redirect handling |
| Inrupt solid-client-authn (JS) | TypeScript | Nothing | 77 | none found | n/a | Authenticated fetch wrapper |
| HTTP::Message | Perl | Released | 32 | PR #225 — merged | +17 · merged & tagged +38 | Request/response classes underneath libwww-perl now know QUERY; shipped in v7.04, cut the same day the PR merged |
| Inrupt solid-client (Java) | Java | Nothing | 17 | none found | n/a | Java Solid client |
Edge, proxies & caches17 rows
Infrastructure in front of apps. Body-aware caching and method allow-lists matter most (RFC 10008 §2.7).
| Stack | Lang | Status | ★ Stars | PR / issue | Days after RFC | Notes |
|---|---|---|---|---|---|---|
| Caddy | Go | Nothing | 75,477 | none found | n/a | No RFC 10008 tracking found. Built on Go's net/http, so raw QUERY requests likely pass through untouched today, but nothing in Caddy's repo/forum addresses QUERY explicitly; closed, pre-RFC #5166 shows unrecognized methods historically fell back rather than returning 501 |
| Traefik | Go | Community PR | 64,739 | Issue #13544 — open · PR #13667 — open | +34 · reply +41 · PR +55 | Maintainers invited contribution; community PR (QUERY in metrics labeling) moved to "review" status (+58) and has sat there since |
| Kong | Lua / Nginx | No response | 44,081 | Discussion #14944 — open | +34 | Proxy, plugins, body-keyed Proxy Cache; retries list missing QUERY. Still zero comments at +80 — 46 days of silence, the longest unanswered thread in the tracker |
| nginx | C | Open | 31,571 | PR #1488 — open · (#1511 closed) | +6 | Recognition only; body cache key TBD; idle since +9 |
| Envoy | C++ | Merged | 28,857 | Issue #46404 — closed completed · PR #46496 — merged | +41 / +46 · LGTM +56 · merged +69 | HTTP/1 + /2 + /3 QUERY support merged to main (+69) behind envoy.reloadable_features.http1_allow_query_method, default on. main is 1.40.0-dev and 1.40 has not been cut yet (latest is v1.39.1, +72), so the first mainstream proxy to land QUERY still has not shipped it |
| http-proxy-middleware | TypeScript | Merged | 11,132 | PR #1277 — merged | +19 | Node reverse-proxy middleware: QUERY proxying covered by tests |
| Cloudflare workerd | C++ | Open | 8,682 | Issue #6849 — open | +14 | Body-keyed QUERY caching (Cache API); idle since +18 |
| HAProxy | C | Nothing | 6,829 | none found | n/a | No public RFC 10008 tracking found |
| nghttp2 | C | Closed (stale) | 5,046 | Issue #2816 — closed not planned | +38 · stale-bot +69 · closed +77 | HTTP/2 library behind curl, Envoy and others; the request for first-class QUERY never drew a single maintainer reply and the stale bot closed it at +77. Not a decision against QUERY — nobody looked |
| Apache httpd | C | Nothing | 4,054 | none found | n/a | Passthrough / proxy path; discuss on dev@httpd |
| Varnish | C | Nothing | 4,045 | none found | n/a | Cache key for QUERY body untracked |
| Skipper | Go | Open | 3,320 | Issue #4113 — open | +19 · active +64 | Zalando's HTTP router / reverse proxy; QUERY support request, still discussion-only |
| Squid | C++ | Nothing | 3,082 | none found | n/a | No public RFC 10008 tracking found |
| KrakenD | Go | Open | 2,672 | Issue #1098 — open | +21 | API gateway; QUERY in the allowed-method set. No maintainer response |
| Apache Traffic Server | C++ | Nothing upstream | 1,980 | none found upstream · fork PR #5 — merged | fork +69 | No QUERY issue or PR upstream. The work exists only in a contributor's fork, where QUERY is registered as a well-known method for the 10.2 line (merged +69); nothing has been proposed to apache/trafficserver itself |
| APISIX (lua-resty-radixtree) | Lua | PR open | 282 | PR #159 — open | +56 · active +70 | The route-matching library under Apache APISIX; QUERY in the method bitmap. Author is pinging maintainers for a CI re-run |
| Managed CDNs (CloudFront, Fastly, Akamai, ALB, …) | — | Opaque | — | vendor docs / changelogs | n/a | Hard to track via GitHub; verify per product |
Specs, docs & tooling25 rows
| Stack | Lang | Status | ★ Stars | PR / issue | Days after RFC | Notes |
|---|---|---|---|---|---|---|
| k6 | Go | Open | 31,375 | Issue #6128 — open | +20 | Load testing; http.request('QUERY', …) already works, the ask is a http.query() convenience wrapper for parity. No maintainer response |
| OpenAPI | Spec | Spec-level | 31,201 | 3.2.0 announcement | −266 | Documents QUERY operations (client + server codegen). 3.2's query path-item key is the gate several tools are waiting on (FastAPI, NestJS Swagger, TypeSpec, Swashbuckle); #5426 updated the spec's HTTP-QUERY references to RFC 10008 for v3.3 (+22) |
| MDN | Docs | Open, active | 10,968 | PR #44568 — open · Issue #44665 — open | +8 / +22 · active +73 | QUERY method + Accept-Query docs. Another contributor offered to finish it (+70) and an MDN maintainer said at +73 they would look at what remains "next week" — that week has passed with no further comment, and the original author is still silent |
| WHATWG HTML | Spec | Open | 9,383 | Issue #12594 — open | +1 · last activity +27 | <form method="query">; a patch exists but overlaps a broader PUT/PATCH/DELETE form-method proposal, and no editor has weighed in |
| openapi-typescript | TypeScript | Two PRs open | 8,352 | PR #2853 — open · PR #2844 — open | +29 · second PR +69 | Types + client generation for OpenAPI 3.2 query operations; two unreviewed PRs |
| Proxyman | Swift | Open | 6,960 | Issue #2708 — open | +24 | macOS/iOS HTTP debugger; QUERY in composer + rules |
| TypeSpec | TypeScript | Design in progress | 5,845 | Issue #11171 — open | +20 · active +71 | Maintainer: "now that it is a published standard we should definitely add support for it". Blocked on a naming collision — @query already means query parameter — with @queryVerb, @verb("query") and a Http.Verb namespace all on the table; the OpenAPI 3.2 emitter side is understood |
| Swashbuckle.AspNetCore | C# | PR open | 5,499 | PR #4092 — open | +48 | QUERY in SwaggerGen operation map + SwaggerUI SubmitMethod ("Try it out"); no review since +48 |
| Dalfox | Go | Merged | 5,274 | PR #1220 — merged · Issue #1185 — closed completed | +9 · merged +23 | XSS scanner: QUERY-method scanning so body-carrying reads are not skipped by security tooling |
| springdoc-openapi | Java | Open | 3,737 | Issue #3309 — open | +44 · touched +48 | Documentation catch-up for Spring's merged QUERY routing; needs the OpenAPI 3.2 operation type |
| HTTP Toolkit | TypeScript | Shipped | 3,619 | Issue #916 — closed completed | +40 · shipped +71 | Interception already worked; QUERY (and TRACE) are now listed on the Send page and in rule matchers |
| Browsers / fetch() | Spec | Works, unofficial | 2,250 | Issue #1938 — open | +14 · idle since +15 | Client surface in browsers; Mozilla #1430 open (idle since +30) · WebKit position re-requested (#709 — open, +61, active +63) after #692 was closed unresolved |
| NestJS Swagger | TypeScript | PR open | 1,890 | PR #4007 — open | +28 · active +70 | OpenAPI module catch-up for NestJS's released QUERY routing; query is gated behind OpenAPI 3.2 so 3.0 documents stay on-spec |
| zod-to-openapi | TypeScript | Open | 1,617 | Issue #393 — open | +57 | OpenAPI 3.2 QUERY operations from Zod schemas |
| OWASP Noir | Crystal | Released (1.3.0) | 1,416 | Issue #2232 — closed completed · PR #2563 — merged | +9 · merged +60 · release +63 | Endpoint-discovery / attack-surface tool; v1.3.0 ships QUERY detection end-to-end across ~24 framework analyzers |
| oasdiff | Go | Released (v1.30.0) | 1,349 | PR #1135 — merged | +50 · merged +68 · release +75 | OpenAPI diff / breaking-change detection understands 3.2 query operations; shipped in v1.30.0 (+75), which lists "OpenAPI 3.2 QUERY and custom methods are compared" |
| DSpace | Java | Open | 1,094 | Issue #12862 — open | +42 · touched +44 | Repository platform evaluating QUERY for discovery/search REST endpoints — an application-level adopter rather than a framework |
| httpYac | TypeScript | Open, PRs in flight | 869 | Issue #934 — open · PR #946 — open · #947 — closed | −35 issue · PRs +76 | CLI / editor runner for .http files. The request predates the RFC by a month; two implementation PRs arrived at +76–+79, one already withdrawn, neither reviewed |
| hono-openapi | TypeScript | Two PRs open | 785 | PR #238 — open · #237 — open | +23 · active +62 | OpenAPI generation for Hono; the PR pairs QUERY support with an OpenAPI 3.2 bump. Hono's own routing has shipped since +48, so this is the documentation half catching up |
| htsget (hts-specs) | Spec | Open | 711 | Issue #866 — open | +70 | Genomics data-retrieval spec considering QUERY for requests too large for a URL |
| go-openapi/spec | Go | Open | 435 | Issue #288 — open · PR #289 — closed | +25 | PathItemProps needs a QUERY field; first attempt closed, discussion continues |
| Apollo Client | TypeScript | Open | 132 | Issue #473 — open | +17 · touched +27 | Feature request for QUERY as the GraphQL-over-HTTP transport; no commitment yet |
| sphinxcontrib-httpdomain | Python | Merged | 62 | PR #114 — merged | +32 · merged +63 | Sphinx directives for documenting HTTP APIs; adds the QUERY method and the Accept-Query header, so Python projects can document QUERY endpoints |
| W3C SPARQL Protocol | Spec | Resolved (informative) | 2 | Issue #40 — closed completed | −198 · closed +77 | Opened before the RFC existed. The WG declined to make QUERY a first-class SPARQL 1.2 binding — 1.2 is scoped to RDF 1.2 and errata — but added an informative Note that QUERY may be used where the server accepts it, mirroring the existing HTTP PATCH note. Oxigraph already supports the verb; Comunica merged it at +77 |
| RFC 10008 | Spec | Published | — | datatracker · HTTP WG | 0 | IESG approval Nov 20, 2025 = −208; query-method |
Purpose-built QUERY projects & interop testing6 rows
Greenfield projects written for QUERY, rather than existing stacks adding it. Tracked separately because star counts here measure novelty, not ecosystem penetration. Contributed via jeswr/http-query-adoption#3 and #4, which were redirected to this repo.
| Project | Lang | Kind | ★ Stars | Source | Days after RFC | Notes |
|---|---|---|---|---|---|---|
| Ayder | C | Adopter | 96 | PR #10 — merged | +31 · merged +43 | HTTP-native durable event log / message bus. interop/spring-query/ emits side-by-side receipts for QUERY-with-JSON-body direct vs. routed through Envoy, plus a Spring-side matching contract |
| rfc10008-interop | — | Interop suite | 0 | repo | +31 | Evidence-first matrix: portable checks emitting machine-readable receipts (PASS / FAIL / NOT_SUPPORTED / NOT_APPLICABLE / UNVERIFIED / OBSERVED) over ETag, conditional revalidation, Content-Location, semantic query identity, method override, CORS preflight and cache observability. Records evidence rather than pass/fail verdicts |
| query-suite-example | JS (Workers) | Reference impl | 0 | repo | +20 | Cloudflare Workers QUERY suite; one of the two implementations currently covered by the interop matrix |
| query-go-sdk | Go | SDK | 0 | repo | +23 · v0.2.1 +49 | Dependency-free client + server SDK; §2.5-conformant redirect handling; v0.2.1 (+49) fixes media-type matching |
| http-query | Rust | SDK | 0 | crates.io · repo | +35 · v0.2.0 +49 | Client + server SDK on reqwest + axum; published to crates.io; v0.2.0 (+49) adds §2.5 redirect handling |
| http_query | Dart | SDK | 0 | pub.dev · repo | +49 | Client + server SDK on package:http; published to pub.dev; 0.2.0 (+49) adds §2.5 redirect handling |
Only two independent implementations are covered by the interop matrix so far, so it is not yet a conformance signal for the stacks in the tables above.
Cross-cutting: redirect semantics (§2.5)6 rows
A recurring failure class, independent of language: clients that treat QUERY like POST on 301/302 and silently downgrade it to GET, discarding the query body.
| Stack | Status | Tracking |
|---|---|---|
| Guzzle | Fixed | PR #3702 — merged (+8) |
| Go (net/http) | Fixed | Issue #80488 — closed completed (+64) · CL 803520 landed |
| Apache HttpClient 5 | Released | part of PR #840 (+15); in 5.7-alpha1 (+58) |
| query-go-sdk / http-query (Rust, Dart) | By design | §2.5-conformant redirect handling added in the +49 releases |
| libwww-perl | Open | Issue #530 (+35) — HTTP::Message knows QUERY (+38) but LWP::UserAgent still downgrades on 302 |
| requests | Acknowledged | maintainer calls the caveat "relatively trivial to handle", but no first-class API is planned yet (#7574, +23) |
Worth checking explicitly in any stack marked "✅ Generic" above — arbitrary-method support does not imply correct redirect handling.