From 2b090e0817de665480f4cf043bb38226369083af Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Tue, 7 Jul 2026 19:21:22 -0300 Subject: [PATCH] feat: add QUERY method helpers to awc client and test servers Extend HTTP QUERY (RFC 10008) support to the remaining per-method convenience surfaces, mirroring PATCH: - awc: `Client::query()` - actix-test: `TestServer::query()` - actix-http-test: `TestServer::query()` and the HTTPS `TestServer::squery()` Also tighten `TestRequest::query()`'s doc to match its sibling helpers. Co-Authored-By: Claude Opus 4.8 --- actix-http-test/CHANGES.md | 1 + actix-http-test/src/lib.rs | 10 ++++++++++ actix-test/CHANGES.md | 1 + actix-test/src/lib.rs | 5 +++++ actix-web/src/test/test_request.rs | 2 -- awc/CHANGES.md | 1 + awc/src/client/mod.rs | 21 +++++++++++++++++++++ 7 files changed, 39 insertions(+), 2 deletions(-) diff --git a/actix-http-test/CHANGES.md b/actix-http-test/CHANGES.md index be19d251a..7f31f76fa 100644 --- a/actix-http-test/CHANGES.md +++ b/actix-http-test/CHANGES.md @@ -2,6 +2,7 @@ ## Unreleased +- Add `TestServer::{query, squery}()` for issuing HTTP `QUERY` requests (RFC 10008). - Minimum supported Rust version (MSRV) is now 1.88. ## 3.2.0 diff --git a/actix-http-test/src/lib.rs b/actix-http-test/src/lib.rs index e3ea69e5c..f99554291 100644 --- a/actix-http-test/src/lib.rs +++ b/actix-http-test/src/lib.rs @@ -216,6 +216,16 @@ impl TestServer { self.client.patch(self.surl(path.as_ref()).as_str()) } + /// Create `QUERY` request + pub fn query>(&self, path: S) -> ClientRequest { + self.client.query(self.url(path.as_ref()).as_str()) + } + + /// Create HTTPS `QUERY` request + pub fn squery>(&self, path: S) -> ClientRequest { + self.client.query(self.surl(path.as_ref()).as_str()) + } + /// Create `DELETE` request pub fn delete>(&self, path: S) -> ClientRequest { self.client.delete(self.url(path.as_ref()).as_str()) diff --git a/actix-test/CHANGES.md b/actix-test/CHANGES.md index fc64cb7a3..49b871581 100644 --- a/actix-test/CHANGES.md +++ b/actix-test/CHANGES.md @@ -2,6 +2,7 @@ ## Unreleased +- Add `TestServer::query()` for issuing HTTP `QUERY` requests (RFC 10008). - Minimum supported Rust version (MSRV) is now 1.88. ## 0.1.5 diff --git a/actix-test/src/lib.rs b/actix-test/src/lib.rs index 84adacbce..10ec32936 100644 --- a/actix-test/src/lib.rs +++ b/actix-test/src/lib.rs @@ -697,6 +697,11 @@ impl TestServer { self.client.patch(self.url(path.as_ref()).as_str()) } + /// Create `QUERY` request. + pub fn query(&self, path: impl AsRef) -> ClientRequest { + self.client.query(self.url(path.as_ref()).as_str()) + } + /// Create `DELETE` request. pub fn delete(&self, path: impl AsRef) -> ClientRequest { self.client.delete(self.url(path.as_ref()).as_str()) diff --git a/actix-web/src/test/test_request.rs b/actix-web/src/test/test_request.rs index 7ce0a621b..e39a8e88e 100644 --- a/actix-web/src/test/test_request.rs +++ b/actix-web/src/test/test_request.rs @@ -112,8 +112,6 @@ impl TestRequest { } /// Constructs test request with QUERY method. - /// - /// `QUERY` (RFC 10008) is safe and idempotent like `GET`, but carries a request body. // TODO: use `Method::QUERY` once the `http` dependency is bumped (see #3384). pub fn query() -> TestRequest { TestRequest::default().method(Method::from_bytes(b"QUERY").unwrap()) diff --git a/awc/CHANGES.md b/awc/CHANGES.md index 9888c66c3..0870f8c71 100644 --- a/awc/CHANGES.md +++ b/awc/CHANGES.md @@ -2,6 +2,7 @@ ## Unreleased +- Add `Client::query()` for constructing HTTP `QUERY` requests (RFC 10008). - Add camel-case header controls to `WebsocketsRequest` via `camel_case_headers()` and `set_camel_case_headers()`. [#3953] - Update `hickory-resolver` dependency to `0.26.1`. - Update `rand` dependency to `0.10`. diff --git a/awc/src/client/mod.rs b/awc/src/client/mod.rs index c9fa37253..d17729d50 100644 --- a/awc/src/client/mod.rs +++ b/awc/src/client/mod.rs @@ -181,6 +181,16 @@ impl Client { self.request(Method::OPTIONS, url) } + /// Construct HTTP *QUERY* request. + // TODO: use `Method::QUERY` once the `http` dependency is bumped (see #3384). + pub fn query(&self, url: U) -> ClientRequest + where + Uri: TryFrom, + >::Error: Into, + { + self.request(Method::from_bytes(b"QUERY").unwrap(), url) + } + /// Initialize a WebSocket connection. /// Returns a WebSocket connection builder. pub fn ws(&self, url: U) -> ws::WebsocketsRequest @@ -203,3 +213,14 @@ impl Client { Rc::get_mut(&mut self.0.default_headers) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn client_query_builds_query_request() { + let req = Client::new().query("/"); + assert_eq!(req.get_method().as_str(), "QUERY"); + } +}