Go to file
Matt Gathu 31348a2339 Provide attribute macro for multiple HTTP methods
What
--
Define a new `route` attribute macro that supports defining multiple
HTTP methods to routed to (handled by) a single handler.

The attribute macro syntax looks like this
```rust
use actix_web::route;

async fn multi_methods() -> &'static str {
    "Hello world!\r\n"
}
```

How
--
This implementation extends the [`GuardType`][1] enum in actix-web-codegen to have a
new `GuardType::Multi` variant that denotes when multiple method guards
are used.

A new `methods` attribute in the `route` attribute macro provides a
comma-separated list of HTTP methods to provide guard for.

The code parses the methods list, matches them to the respective
`GuardType` and uses the `AnyGuard` struct to combine them together.

A constructor method for [`AnyGuard`][2] is added to support this.

The generated code looks like this:
```rust
pub struct multi_methods;
impl actix_web::dev::HttpServiceFactory for multi_methods {
    fn register(self, __config: &mut actix_web::dev::AppService) {
    ¦   async fn multi_methods() -> &'static str {
    ¦   ¦   "Hello world!\r\n"
    ¦   }
    ¦   let __resource = actix_web::Resource::new("/multi")
    ¦   ¦   .name("multi_methods")
    ¦   ¦   .guard(actix_web:💂:AnyGuard::new(<[_]>::into_vec(box [
    ¦   ¦   ¦   Box::new(actix_web:💂:Get()),
    ¦   ¦   ¦   Box::new(actix_web:💂:Post()),
    ¦   ¦   ])))
    ¦   ¦   .to(multi_methods);
    ¦   actix_web::dev::HttpServiceFactory::register(__resource, __config)
    }
}
```

**NOTE: This is my first attempt that implementing this feature.
Feedback and mentorship is highly welcome to improve it :-)**

Why
--
This fixes https://github.com/actix/actix-web/issues/1360

[1]: https://github.com/actix/actix-web/blob/master/actix-web-codegen/src/route.rs#L21
[2]: https://github.com/actix/actix-web/blob/master/src/guard.rs#L104s
2020-09-15 20:26:08 +02:00
.github Use action to upload docs 2020-08-13 16:04:50 +09:00
actix-files the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
actix-http the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
actix-multipart the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
actix-web-actors the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
actix-web-codegen Provide attribute macro for multiple HTTP methods 2020-09-15 20:26:08 +02:00
awc the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
benches Fix leaks with actix_http's client (#1580) 2020-07-10 22:35:22 +01:00
docs/graphs bump connect and tls versions (#1655) 2020-09-09 09:20:54 +01:00
examples re-export actix_rt::main macro (#1559) 2020-06-18 15:45:30 +01:00
src Provide attribute macro for multiple HTTP methods 2020-09-15 20:26:08 +02:00
test-server Add possibility to set address for test_server (#1645) 2020-09-15 12:09:16 +01:00
tests make TrailingSlash enum accessible (#1673) 2020-09-13 00:55:39 +01:00
.gitignore make TrailingSlash enum accessible (#1673) 2020-09-13 00:55:39 +01:00
CHANGES.md prepare web release 3.0.2 (#1681) 2020-09-15 13:14:14 +01:00
CODE_OF_CONDUCT.md code of conduct 2018-01-21 15:29:02 -08:00
Cargo.toml prepare web release 3.0.2 (#1681) 2020-09-15 13:14:14 +01:00
LICENSE-APACHE the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
LICENSE-MIT the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
MIGRATION.md update migration guide 2020-09-14 22:26:03 +01:00
README.md the big three point oh (#1668) 2020-09-11 13:50:10 +01:00
codecov.yml Remove codecoverage for tests and examples (#1299) 2020-01-24 05:10:02 +09:00
rust-toolchain bump MSRV to 1.42 (#1616) 2020-07-21 16:40:30 +09:00
rustfmt.toml copy actix-web2 2019-03-01 22:51:32 -08:00

README.md

Actix web

Actix web is a powerful, pragmatic, and extremely fast web framework for Rust

crates.io Documentation Version License
Build Status codecov Download Join the chat at https://gitter.im/actix/actix

Features

Documentation

Example

Dependencies:

[dependencies]
actix-web = "3"

Code:

use actix_web::{get, web, App, HttpServer, Responder};

#[get("/{id}/{name}/index.html")]
async fn index(web::Path((id, name)): web::Path<(u32, String)>) -> impl Responder {
    format!("Hello {}! id:{}", name, id)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(index))
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

More examples

You may consider checking out this directory for more examples.

Benchmarks

One of the fastest web frameworks available according to the TechEmpower Framework Benchmark.

License

This project is licensed under either of

at your option.

Code of Conduct

Contribution to the actix-web crate is organized under the terms of the Contributor Covenant, the maintainers of Actix web, promises to intervene to uphold that code of conduct.