Add support for QUERY method

Closes #2873.
This commit is contained in:
Will Hawkins 2024-10-02 23:04:34 -04:00
parent 3bf9ef02d6
commit 43a4e2213c
2 changed files with 58 additions and 45 deletions

View File

@ -293,6 +293,7 @@ route_attribute!(delete => Method::Delete);
route_attribute!(head => Method::Head); route_attribute!(head => Method::Head);
route_attribute!(patch => Method::Patch); route_attribute!(patch => Method::Patch);
route_attribute!(options => Method::Options); route_attribute!(options => Method::Options);
route_attribute!(query => Method::Query);
/// Attribute to generate a [`Catcher`] and associated metadata. /// Attribute to generate a [`Catcher`] and associated metadata.
/// ///

View File

@ -3,51 +3,68 @@ use std::str::FromStr;
self::define_methods! { self::define_methods! {
// enum variant method name body safe idempotent [RFC,section] // enum variant method name body safe idempotent [RFC,section]
Get "GET" maybe yes yes [9110,9.3.1] Get "GET" maybe yes yes [9110,"9.3.1"]
Head "HEAD" maybe yes yes [9110,9.3.2] Head "HEAD" maybe yes yes [9110,"9.3.2"]
Post "POST" yes no no [9110,9.3.3] Post "POST" yes no no [9110,"9.3.3"]
Put "PUT" yes no yes [9110,9.3.4] Put "PUT" yes no yes [9110,"9.3.4"]
Delete "DELETE" maybe no yes [9110,9.3.5] Delete "DELETE" maybe no yes [9110,"9.3.5"]
Connect "CONNECT" maybe no no [9110,9.3.6] Connect "CONNECT" maybe no no [9110,"9.3.6"]
Options "OPTIONS" maybe yes yes [9110,9.3.7] Options "OPTIONS" maybe yes yes [9110,"9.3.7"]
Trace "TRACE" no yes yes [9110,9.3.8] Trace "TRACE" no yes yes [9110,"9.3.8"]
Patch "PATCH" yes no no [5789,2] Patch "PATCH" yes no no [5789,"2"]
Query "QUERY" maybe yes yes ["DRAFT", "httpbis-safe-method-w-body", "1", "05"]
Acl "ACL" yes no yes [3744,8.1] Acl "ACL" yes no yes [3744,"8.1"]
BaselineControl "BASELINE-CONTROL" yes no yes [3253,12.6] BaselineControl "BASELINE-CONTROL" yes no yes [3253,"12.6"]
Bind "BIND" yes no yes [5842,4] Bind "BIND" yes no yes [5842,"4"]
CheckIn "CHECKIN" yes no yes [3253,4.4] CheckIn "CHECKIN" yes no yes [3253,"4.4"]
CheckOut "CHECKOUT" maybe no yes [3253,4.3] CheckOut "CHECKOUT" maybe no yes [3253,"4.3"]
Copy "COPY" maybe no yes [4918,9.8] Copy "COPY" maybe no yes [4918,"9.8"]
Label "LABEL" yes no yes [3253,8.2] Label "LABEL" yes no yes [3253,"8.2"]
Link "LINK" maybe no yes [2068,19.6.1.2] Link "LINK" maybe no yes [2068,"19.6.1.2"]
Lock "LOCK" yes no no [4918,9.10] Lock "LOCK" yes no no [4918,"9.10"]
Merge "MERGE" yes no yes [3253,11.2] Merge "MERGE" yes no yes [3253,"11.2"]
MkActivity "MKACTIVITY" yes no yes [3253,13.5] MkActivity "MKACTIVITY" yes no yes [3253,"13.5"]
MkCalendar "MKCALENDAR" yes no yes [4791,5.3.1][8144,2.3] MkCalendar "MKCALENDAR" yes no yes [4791,"5.3.1"][8144,"2.3"]
MkCol "MKCOL" yes no yes [4918,9.3][5689,3][8144,2.3] MkCol "MKCOL" yes no yes [4918,"9.3"][5689,"3"][8144,"2.3"]
MkRedirectRef "MKREDIRECTREF" yes no yes [4437,6] MkRedirectRef "MKREDIRECTREF" yes no yes [4437,"6"]
MkWorkspace "MKWORKSPACE" yes no yes [3253,6.3] MkWorkspace "MKWORKSPACE" yes no yes [3253,"6.3"]
Move "MOVE" maybe no yes [4918,9.9] Move "MOVE" maybe no yes [4918,"9.9"]
OrderPatch "ORDERPATCH" yes no yes [3648,7] OrderPatch "ORDERPATCH" yes no yes [3648,"7"]
PropFind "PROPFIND" yes yes yes [4918,9.1][8144,2.1] PropFind "PROPFIND" yes yes yes [4918,"9.1"][8144,"2.1"]
PropPatch "PROPPATCH" yes no yes [4918,9.2][8144,2.2] PropPatch "PROPPATCH" yes no yes [4918,"9.2"][8144,"2.2"]
Rebind "REBIND" yes no yes [5842,6] Rebind "REBIND" yes no yes [5842,"6"]
Report "REPORT" yes yes yes [3253,3.6][8144,2.1] Report "REPORT" yes yes yes [3253,"3.6"][8144,"2.1"]
Search "SEARCH" yes yes yes [5323,2] Search "SEARCH" yes yes yes [5323,"2"]
Unbind "UNBIND" yes no yes [5842,5] Unbind "UNBIND" yes no yes [5842,"5"]
Uncheckout "UNCHECKOUT" maybe no yes [3253,4.5] Uncheckout "UNCHECKOUT" maybe no yes [3253,"4.5"]
Unlink "UNLINK" maybe no yes [2068,19.6.1.3] Unlink "UNLINK" maybe no yes [2068,"19.6.1.3"]
Unlock "UNLOCK" maybe no yes [4918,9.11] Unlock "UNLOCK" maybe no yes [4918,"9.11"]
Update "UPDATE" yes no yes [3253,7.1] Update "UPDATE" yes no yes [3253,"7.1"]
UpdateRedirectRef "UPDATEREDIRECTREF" yes no yes [4437,7] UpdateRedirectRef "UPDATEREDIRECTREF" yes no yes [4437,"7"]
VersionControl "VERSION-CONTROL" yes no yes [3253,3.5] VersionControl "VERSION-CONTROL" yes no yes [3253,"3.5"]
} }
#[doc(hidden)] #[doc(hidden)]
#[macro_export] #[macro_export]
macro_rules! define_methods { macro_rules! define_methods {
($($V:ident $name:tt $body:ident $safe:ident $idem:ident $([$n:expr,$s:expr])+)*) => { ($($V:ident $name:tt $body:ident $safe:ident $idem:ident $([$base:tt, $($s:tt)+])+)*) => {
macro_rules! generate_rfc_url {
("DRAFT", $draft_name: literal, $draft_section: literal, $draft_revision: literal) => {
concat!(" [Internet Draft ", $draft_name,
" §", $draft_section, "]",
"(https://datatracker.ietf.org/doc/html/draft-ietf-", $draft_name, "-", $draft_revision, "#section-", $draft_section, ")")
};
($rfc_number: literal, $rfc_section:literal) => {
concat!(" [RFC", stringify!($rfc_number),
" §", $rfc_section, "]",
"(https://www.rfc-editor.org/rfc/rfc", stringify!($rfc_number), ".html", "#section-", $rfc_section, ")")
};
}
/// An HTTP method. /// An HTTP method.
/// ///
/// Each variant corresponds to a method in the [HTTP Method Registry]. /// Each variant corresponds to a method in the [HTTP Method Registry].
@ -88,12 +105,7 @@ macro_rules! define_methods {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Method {$( pub enum Method {$(
#[doc = concat!("The `", $name, "` method.")] #[doc = concat!("The `", $name, "` method.")]
#[doc = concat!("Defined in" $(, #[doc = concat!("Defined in " $(, generate_rfc_url!($base, $($s)+), )","+ ".")]
" [RFC", stringify!($n), " §", stringify!($s), "]",
"(https://www.rfc-editor.org/rfc/rfc", stringify!($n), ".html",
"#section-", stringify!($s), ")",
)","+ ".")]
///
#[doc = concat!("* safe: `", stringify!($safe), "`")] #[doc = concat!("* safe: `", stringify!($safe), "`")]
#[doc = concat!("* idempotent: `", stringify!($idem), "`")] #[doc = concat!("* idempotent: `", stringify!($idem), "`")]
#[doc = concat!("* request body: `", stringify!($body), "`")] #[doc = concat!("* request body: `", stringify!($body), "`")]