diff --git a/actix-web-codegen/src/route.rs b/actix-web-codegen/src/route.rs index 9f99ff01a..ddbd42454 100644 --- a/actix-web-codegen/src/route.rs +++ b/actix-web-codegen/src/route.rs @@ -89,6 +89,8 @@ impl Args { let mut guards = Vec::new(); let mut wrappers = Vec::new(); let mut methods = HashSet::new(); + + let is_route_macro = method.is_none(); if let Some(method) = method { methods.insert(method); } @@ -126,7 +128,12 @@ impl Args { )); } } else if nv.path.is_ident("method") { - if let syn::Lit::Str(ref lit) = nv.lit { + if !is_route_macro { + return Err(syn::Error::new_spanned( + &nv, + "HTTP method forbidden here. To handle multiple methods, use `route` instead", + )); + } else if let syn::Lit::Str(ref lit) = nv.lit { let method = MethodType::try_from(lit)?; if !methods.insert(method) { return Err(syn::Error::new_spanned( diff --git a/actix-web-codegen/tests/trybuild/simple-fail.rs b/actix-web-codegen/tests/trybuild/simple-fail.rs index 140497687..368cff046 100644 --- a/actix-web-codegen/tests/trybuild/simple-fail.rs +++ b/actix-web-codegen/tests/trybuild/simple-fail.rs @@ -22,4 +22,9 @@ async fn four() -> impl Responder { HttpResponse::Ok() } +#[delete("/five", method="GET")] +async fn five() -> impl Responder { + HttpResponse::Ok() +} + fn main() {} diff --git a/actix-web-codegen/tests/trybuild/simple-fail.stderr b/actix-web-codegen/tests/trybuild/simple-fail.stderr index 12c32c00d..cffc81ff8 100644 --- a/actix-web-codegen/tests/trybuild/simple-fail.stderr +++ b/actix-web-codegen/tests/trybuild/simple-fail.stderr @@ -21,3 +21,9 @@ error: Multiple paths specified! Should be only one! | 20 | #[delete("/four", "/five")] | ^^^^^^^ + +error: HTTP method forbidden here. To handle multiple methods, use `route` instead + --> $DIR/simple-fail.rs:25:19 + | +25 | #[delete("/five", method="GET")] + | ^^^^^^^^^^^^