pub struct CorsLayer { /* private fields */ }
Expand description
Layer that applies the Cors
middleware which adds headers for CORS.
See the module docs for an example.
Implementations§
§impl CorsLayer
impl CorsLayer
pub fn new() -> CorsLayer
pub fn new() -> CorsLayer
Create a new CorsLayer
.
No headers are sent by default. Use the builder methods to customize the behavior.
You need to set at least an allowed origin for browsers to make successful cross-origin requests to your service.
pub fn permissive() -> CorsLayer
pub fn permissive() -> CorsLayer
A permissive configuration:
- All request headers allowed.
- All methods allowed.
- All origins allowed.
- All headers exposed.
pub fn very_permissive() -> CorsLayer
pub fn very_permissive() -> CorsLayer
A very permissive configuration:
- Credentials allowed.
- The method received in
Access-Control-Request-Method
is sent back as an allowed method. - The origin of the preflight request is sent back as an allowed origin.
- The header names received in
Access-Control-Request-Headers
are sent back as allowed headers. - No headers are currently exposed, but this may change in the future.
pub fn allow_credentials<T>(self, allow_credentials: T) -> CorsLayerwhere
T: Into<AllowCredentials>,
pub fn allow_credentials<T>(self, allow_credentials: T) -> CorsLayerwhere
T: Into<AllowCredentials>,
Set the Access-Control-Allow-Credentials
header.
use rama_http::layer::cors::CorsLayer;
let layer = CorsLayer::new().allow_credentials(true);
pub fn allow_headers<T>(self, headers: T) -> CorsLayerwhere
T: Into<AllowHeaders>,
pub fn allow_headers<T>(self, headers: T) -> CorsLayerwhere
T: Into<AllowHeaders>,
Set the value of the Access-Control-Allow-Headers
header.
use rama_http::layer::cors::CorsLayer;
use rama_http::header::{AUTHORIZATION, ACCEPT};
let layer = CorsLayer::new().allow_headers([AUTHORIZATION, ACCEPT]);
All headers can be allowed with
use rama_http::layer::cors::{Any, CorsLayer};
let layer = CorsLayer::new().allow_headers(Any);
You can also use an async closure:
use rama_http::layer::cors::{CorsLayer, AllowOrigin};
use rama_http::dep::http::{request::Parts as RequestParts, HeaderValue};
let client = get_api_client();
let layer = CorsLayer::new().allow_origin(AllowOrigin::async_predicate(
|origin: HeaderValue, _request_parts: &RequestParts| async move {
// fetch list of origins that are allowed
let origins = client.fetch_allowed_origins().await;
origins.contains(&origin)
},
));
let client = get_api_client();
// if using &RequestParts, make sure all the values are owned
// before passing into the future
let layer = CorsLayer::new().allow_origin(AllowOrigin::async_predicate(
|origin: HeaderValue, parts: &RequestParts| {
let path = parts.uri.path().to_owned();
async move {
// fetch list of origins that are allowed for this path
let origins = client.fetch_allowed_origins_for_path(path).await;
origins.contains(&origin)
}
},
));
Note that multiple calls to this method will override any previous calls.
Also note that Access-Control-Allow-Headers
is required for requests that have
Access-Control-Request-Headers
.
pub fn max_age<T>(self, max_age: T) -> CorsLayer
pub fn max_age<T>(self, max_age: T) -> CorsLayer
Set the value of the Access-Control-Max-Age
header.
use std::time::Duration;
use rama_http::layer::cors::CorsLayer;
let layer = CorsLayer::new().max_age(Duration::from_secs(60) * 10);
By default the header will not be set which disables caching and will require a preflight call for all requests.
Note that each browser has a maximum internal value that takes precedence when the Access-Control-Max-Age is greater. For more details see mdn.
If you need more flexibility, you can use supply a function which can dynamically decide the max-age based on the origin and other parts of each preflight request:
use std::time::Duration;
use rama_http::dep::http::{request::Parts as RequestParts, HeaderValue};
use rama_http::layer::cors::{CorsLayer, MaxAge};
let layer = CorsLayer::new().max_age(MaxAge::dynamic(
|_origin: &HeaderValue, parts: &RequestParts| -> Duration {
// Let's say you want to be able to reload your config at
// runtime and have another middleware that always inserts
// the current config into the request extensions
let config = parts.extensions.get::<MyServerConfig>().unwrap();
config.cors_max_age
},
));
pub fn allow_methods<T>(self, methods: T) -> CorsLayerwhere
T: Into<AllowMethods>,
pub fn allow_methods<T>(self, methods: T) -> CorsLayerwhere
T: Into<AllowMethods>,
Set the value of the Access-Control-Allow-Methods
header.
use rama_http::layer::cors::CorsLayer;
use rama_http::Method;
let layer = CorsLayer::new().allow_methods([Method::GET, Method::POST]);
All methods can be allowed with
use rama_http::layer::cors::{Any, CorsLayer};
let layer = CorsLayer::new().allow_methods(Any);
Note that multiple calls to this method will override any previous calls.
pub fn allow_origin<T>(self, origin: T) -> CorsLayerwhere
T: Into<AllowOrigin>,
pub fn allow_origin<T>(self, origin: T) -> CorsLayerwhere
T: Into<AllowOrigin>,
Set the value of the Access-Control-Allow-Origin
header.
use rama_http::HeaderValue;
use rama_http::layer::cors::CorsLayer;
let layer = CorsLayer::new().allow_origin(
"http://example.com".parse::<HeaderValue>().unwrap(),
);
Multiple origins can be allowed with
use rama_http::layer::cors::CorsLayer;
let origins = [
"http://example.com".parse().unwrap(),
"http://api.example.com".parse().unwrap(),
];
let layer = CorsLayer::new().allow_origin(origins);
All origins can be allowed with
use rama_http::layer::cors::{Any, CorsLayer};
let layer = CorsLayer::new().allow_origin(Any);
You can also use a closure
use rama_http::layer::cors::{CorsLayer, AllowOrigin};
use rama_http::dep::http::{request::Parts as RequestParts, HeaderValue};
let layer = CorsLayer::new().allow_origin(AllowOrigin::predicate(
|origin: &HeaderValue, _request_parts: &RequestParts| {
origin.as_bytes().ends_with(b".rust-lang.org")
},
));
Note that multiple calls to this method will override any previous calls.
pub fn expose_headers<T>(self, headers: T) -> CorsLayerwhere
T: Into<ExposeHeaders>,
pub fn expose_headers<T>(self, headers: T) -> CorsLayerwhere
T: Into<ExposeHeaders>,
Set the value of the Access-Control-Expose-Headers
header.
use rama_http::layer::cors::CorsLayer;
use rama_http::header::CONTENT_ENCODING;
let layer = CorsLayer::new().expose_headers([CONTENT_ENCODING]);
All headers can be allowed with
use rama_http::layer::cors::{Any, CorsLayer};
let layer = CorsLayer::new().expose_headers(Any);
Note that multiple calls to this method will override any previous calls.
pub fn allow_private_network<T>(self, allow_private_network: T) -> CorsLayerwhere
T: Into<AllowPrivateNetwork>,
pub fn allow_private_network<T>(self, allow_private_network: T) -> CorsLayerwhere
T: Into<AllowPrivateNetwork>,
Set the value of the Access-Control-Allow-Private-Network
header.
use rama_http::layer::cors::CorsLayer;
let layer = CorsLayer::new().allow_private_network(true);
pub fn vary<T>(self, headers: T) -> CorsLayer
pub fn vary<T>(self, headers: T) -> CorsLayer
Set the value(s) of the Vary
header.
In contrast to the other headers, this one has a non-empty default of
preflight_request_headers()
.
You only need to set this is you want to remove some of these defaults, or if you use a closure for one of the other headers and want to add a vary header accordingly.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for CorsLayer
impl !RefUnwindSafe for CorsLayer
impl Send for CorsLayer
impl Sync for CorsLayer
impl Unpin for CorsLayer
impl !UnwindSafe for CorsLayer
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§fn and<S, P, B, E>(self, other: P) -> And<T, P>
fn and<S, P, B, E>(self, other: P) -> And<T, P>
Policy
that returns Action::Follow
only if self
and other
return
Action::Follow
. Read more§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.