I'm trying to add a CORS policy to my rocket API. I've tried a couple ways but the closest (I think) and most straightforward way so far has been to add a custom Fairing that sets the CORS headers in the on_response
hook. I've been using the Fairings implementation guide and this answer to a similar question, but I am running into complaints about lifetimes.
This is the on_response
hook.
fn on_response(&self, request: &Request, response: &mut Response) {
response.set_header(Header::new("Access-Control-Allow-Origin", "*"));
response.set_header(Header::new("Access-Control-Allow-Methods", "POST, GET, PATCH, OPTIONS"));
response.set_header(Header::new("Access-Control-Allow-Headers", "*"));
response.set_header(Header::new("Access-Control-Allow-Credentials", "true"));
}
Running cargo run
yields the following error:
error[E0195]: lifetime parameters or bounds on method `on_response` do not match the trait declaration
--> src/main.rs:16:19
|
16 | fn on_response(&self, request: &Request, response: &mut Response) {
| ^ lifetimes do not match method in trait
Is there a way to resolve the lifetime complaints?
Also of interest would be an idiomatic way to set CORS in Rocket (I've looked at rocket_cors but following the examples creates a bunch of version headaches regarding having to use nightly builds, but maybe I missed a more straightforward way?).
Here's the full code:
Main.rs:
use rocket::http::Header;
use rocket::{Request, Response};
use rocket::fairing::{Fairing, Info, Kind};
#[macro_use] extern crate rocket;
pub struct CORS;
impl Fairing for CORS {
fn info(&self) -> Info {
Info {
name: "Add CORS headers to responses",
kind: Kind::Response
}
}
fn on_response(&self, request: &Request, response: &mut Response) {
response.set_header(Header::new("Access-Control-Allow-Origin", "*"));
response.set_header(Header::new("Access-Control-Allow-Methods", "POST, GET, PATCH, OPTIONS"));
response.set_header(Header::new("Access-Control-Allow-Headers", "*"));
response.set_header(Header::new("Access-Control-Allow-Credentials", "true"));
}
}
#[get("/")]
fn index() -> &'static str {
"Hello, world!"
}
#[launch]
fn rocket() -> _ {
rocket::build()
.attach(CORS)
.mount("/", routes![index])
}
cargo.toml
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rocket = "0.5.0-rc.1"
rocket_cors = "0.5.2"